{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# CPSC 330 Lecture 18"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lecture plan:\n",
    "\n",
    "- 👋\n",
    "- **Turn on recording**\n",
    "- Announcements\n",
    "- Our standard approach (15 min)\n",
    "- Censoring and survival analysis (20 min)\n",
    "- Break (5 min)\n",
    "- Kaplan-Meier curve (10 min)\n",
    "- Cox proportional hazards model (15 min)\n",
    "- Prediction (10 min)\n",
    "- Other approaches / what did we not cover? (5 min)\n",
    "\n",
    "Piazza: \n",
    "\n",
    "- True/False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Learning objectives\n",
    "\n",
    "- Explain the problem with treating right-censored data the same as \"regular\" data.\n",
    "- Determine whether survival analysis is an appropriate tool for a given problem.\n",
    "- Apply survival analysis in Python using the `lifelines` package.\n",
    "- Interpret a survival curve, such as the Kaplan-Meier curve.\n",
    "- Interpret the coefficients of a fitted Cox proportional hazards model.\n",
    "- Make predictions for existing individuals and interpret these predictions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.dummy import DummyClassifier\n",
    "from sklearn.linear_model import LogisticRegression, Ridge\n",
    "from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor\n",
    "from sklearn.model_selection import train_test_split, cross_val_score, cross_validate, cross_val_predict\n",
    "from sklearn.metrics import plot_confusion_matrix, confusion_matrix\n",
    "from sklearn.impute import SimpleImputer\n",
    "from sklearn.compose import ColumnTransformer, make_column_transformer\n",
    "from sklearn.pipeline import Pipeline, make_pipeline\n",
    "from sklearn.preprocessing import StandardScaler, OrdinalEncoder, OneHotEncoder, FunctionTransformer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.rcParams['font.size'] = 16"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import lifelines"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# does lifelines try to mess with this?\n",
    "pd.options.display.max_rows = 10"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Announcements\n",
    "\n",
    "- hw7 released, due next Monday 11:59pm\n",
    "- hw8 will be a free-form ML task, hw9 will be a blog post\n",
    "- See Piazza for final exam details"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Customer churn: our standard approach (10 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- In hw4 you looked at a dataset about [customer churn](https://en.wikipedia.org/wiki/Customer_attrition).\n",
    "- In hw4, the dataset was interesting because it's unbalanced (most customers stay). \n",
    "- Today we'll look at a different customer churn [dataset](https://www.kaggle.com/blastchar/telco-customer-churn), because it has a feature we need - time!\n",
    "- We'll explore the time aspect of the dataset today."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>customerID</th>\n",
       "      <th>gender</th>\n",
       "      <th>SeniorCitizen</th>\n",
       "      <th>Partner</th>\n",
       "      <th>Dependents</th>\n",
       "      <th>tenure</th>\n",
       "      <th>PhoneService</th>\n",
       "      <th>MultipleLines</th>\n",
       "      <th>InternetService</th>\n",
       "      <th>OnlineSecurity</th>\n",
       "      <th>...</th>\n",
       "      <th>DeviceProtection</th>\n",
       "      <th>TechSupport</th>\n",
       "      <th>StreamingTV</th>\n",
       "      <th>StreamingMovies</th>\n",
       "      <th>Contract</th>\n",
       "      <th>PaperlessBilling</th>\n",
       "      <th>PaymentMethod</th>\n",
       "      <th>MonthlyCharges</th>\n",
       "      <th>TotalCharges</th>\n",
       "      <th>Churn</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6464</th>\n",
       "      <td>4726-DLWQN</td>\n",
       "      <td>Male</td>\n",
       "      <td>1</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>50</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>DSL</td>\n",
       "      <td>Yes</td>\n",
       "      <td>...</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>Month-to-month</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Bank transfer (automatic)</td>\n",
       "      <td>70.35</td>\n",
       "      <td>3454.6</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5707</th>\n",
       "      <td>4537-DKTAL</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>2</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>DSL</td>\n",
       "      <td>No</td>\n",
       "      <td>...</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>Month-to-month</td>\n",
       "      <td>No</td>\n",
       "      <td>Electronic check</td>\n",
       "      <td>45.55</td>\n",
       "      <td>84.4</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3442</th>\n",
       "      <td>0468-YRPXN</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>29</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>Fiber optic</td>\n",
       "      <td>No</td>\n",
       "      <td>...</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Month-to-month</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Credit card (automatic)</td>\n",
       "      <td>98.80</td>\n",
       "      <td>2807.1</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3932</th>\n",
       "      <td>1304-NECVQ</td>\n",
       "      <td>Female</td>\n",
       "      <td>1</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>2</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Fiber optic</td>\n",
       "      <td>No</td>\n",
       "      <td>...</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>Month-to-month</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Electronic check</td>\n",
       "      <td>78.55</td>\n",
       "      <td>149.55</td>\n",
       "      <td>Yes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6124</th>\n",
       "      <td>7153-CHRBV</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>57</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>DSL</td>\n",
       "      <td>Yes</td>\n",
       "      <td>...</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>One year</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Mailed check</td>\n",
       "      <td>59.30</td>\n",
       "      <td>3274.35</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 21 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      customerID  gender  SeniorCitizen Partner Dependents  tenure  \\\n",
       "6464  4726-DLWQN    Male              1      No         No      50   \n",
       "5707  4537-DKTAL  Female              0      No         No       2   \n",
       "3442  0468-YRPXN    Male              0      No         No      29   \n",
       "3932  1304-NECVQ  Female              1      No         No       2   \n",
       "6124  7153-CHRBV  Female              0     Yes        Yes      57   \n",
       "\n",
       "     PhoneService MultipleLines InternetService OnlineSecurity  ...  \\\n",
       "6464          Yes           Yes             DSL            Yes  ...   \n",
       "5707          Yes            No             DSL             No  ...   \n",
       "3442          Yes            No     Fiber optic             No  ...   \n",
       "3932          Yes           Yes     Fiber optic             No  ...   \n",
       "6124          Yes            No             DSL            Yes  ...   \n",
       "\n",
       "     DeviceProtection TechSupport StreamingTV StreamingMovies        Contract  \\\n",
       "6464               No          No         Yes              No  Month-to-month   \n",
       "5707               No          No          No              No  Month-to-month   \n",
       "3442              Yes         Yes         Yes             Yes  Month-to-month   \n",
       "3932              Yes          No          No              No  Month-to-month   \n",
       "6124              Yes         Yes          No              No        One year   \n",
       "\n",
       "     PaperlessBilling              PaymentMethod MonthlyCharges  TotalCharges  \\\n",
       "6464              Yes  Bank transfer (automatic)          70.35        3454.6   \n",
       "5707               No           Electronic check          45.55          84.4   \n",
       "3442              Yes    Credit card (automatic)          98.80        2807.1   \n",
       "3932              Yes           Electronic check          78.55        149.55   \n",
       "6124              Yes               Mailed check          59.30       3274.35   \n",
       "\n",
       "     Churn  \n",
       "6464    No  \n",
       "5707    No  \n",
       "3442    No  \n",
       "3932   Yes  \n",
       "6124    No  \n",
       "\n",
       "[5 rows x 21 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv(\"data/WA_Fn-UseC_-Telco-Customer-Churn.csv\")\n",
    "df_train, df_test = train_test_split(df, random_state=123)\n",
    "df_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are trying to predict `Churn` (yes/no) from these other columns."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5282, 21)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No     3912\n",
       "Yes    1370\n",
       "Name: Churn, dtype: int64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train[\"Churn\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 5282 entries, 6464 to 3582\n",
      "Data columns (total 21 columns):\n",
      " #   Column            Non-Null Count  Dtype  \n",
      "---  ------            --------------  -----  \n",
      " 0   customerID        5282 non-null   object \n",
      " 1   gender            5282 non-null   object \n",
      " 2   SeniorCitizen     5282 non-null   int64  \n",
      " 3   Partner           5282 non-null   object \n",
      " 4   Dependents        5282 non-null   object \n",
      " 5   tenure            5282 non-null   int64  \n",
      " 6   PhoneService      5282 non-null   object \n",
      " 7   MultipleLines     5282 non-null   object \n",
      " 8   InternetService   5282 non-null   object \n",
      " 9   OnlineSecurity    5282 non-null   object \n",
      " 10  OnlineBackup      5282 non-null   object \n",
      " 11  DeviceProtection  5282 non-null   object \n",
      " 12  TechSupport       5282 non-null   object \n",
      " 13  StreamingTV       5282 non-null   object \n",
      " 14  StreamingMovies   5282 non-null   object \n",
      " 15  Contract          5282 non-null   object \n",
      " 16  PaperlessBilling  5282 non-null   object \n",
      " 17  PaymentMethod     5282 non-null   object \n",
      " 18  MonthlyCharges    5282 non-null   float64\n",
      " 19  TotalCharges      5282 non-null   object \n",
      " 20  Churn             5282 non-null   object \n",
      "dtypes: float64(1), int64(2), object(18)\n",
      "memory usage: 907.8+ KB\n"
     ]
    }
   ],
   "source": [
    "df_train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Question: Does this mean there is no missing data?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ok, let's try our usual approach:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "numeric_features = ['tenure', 'MonthlyCharges', 'TotalCharges']\n",
    "drop_features    = ['customerID']\n",
    "target_column    = ['Churn']\n",
    "# the rest are categorical\n",
    "categorical_features = list(set(df_train.columns)-set(numeric_features)-set(drop_features)-set(target_column))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "preprocessing = ColumnTransformer([\n",
    "    ('scale',  StandardScaler(), numeric_features),\n",
    "    ('ohe',    OneHotEncoder(), categorical_features) \n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "tags": [
     "raises-exception"
    ]
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "could not convert string to float: ''",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-11-a3e10b6cacc4>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mpreprocessing\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m;\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/sklearn/compose/_column_transformer.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m    492\u001b[0m         \u001b[0;31m# we use fit_transform to make sure to set sparse_output_ (for which we\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    493\u001b[0m         \u001b[0;31m# need the transformed data) to have consistent output type in predict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 494\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    495\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    496\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/sklearn/compose/_column_transformer.py\u001b[0m in \u001b[0;36mfit_transform\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m    529\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_remainder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    530\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 531\u001b[0;31m         \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_fit_transform_one\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    532\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    533\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/sklearn/compose/_column_transformer.py\u001b[0m in \u001b[0;36m_fit_transform\u001b[0;34m(self, X, y, func, fitted)\u001b[0m\n\u001b[1;32m    456\u001b[0m             self._iter(fitted=fitted, replace_strings=True))\n\u001b[1;32m    457\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 458\u001b[0;31m             return Parallel(n_jobs=self.n_jobs)(\n\u001b[0m\u001b[1;32m    459\u001b[0m                 delayed(func)(\n\u001b[1;32m    460\u001b[0m                     \u001b[0mtransformer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mclone\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrans\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mfitted\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mtrans\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m   1027\u001b[0m             \u001b[0;31m# remaining jobs.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1028\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1029\u001b[0;31m             \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch_one_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1030\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_iterator\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1031\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mdispatch_one_batch\u001b[0;34m(self, iterator)\u001b[0m\n\u001b[1;32m    845\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    846\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 847\u001b[0;31m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtasks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    848\u001b[0m                 \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    849\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m_dispatch\u001b[0;34m(self, batch)\u001b[0m\n\u001b[1;32m    763\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    764\u001b[0m             \u001b[0mjob_idx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 765\u001b[0;31m             \u001b[0mjob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    766\u001b[0m             \u001b[0;31m# A job can complete so quickly than its callback is\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    767\u001b[0m             \u001b[0;31m# called before we get here, causing self._jobs to\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mapply_async\u001b[0;34m(self, func, callback)\u001b[0m\n\u001b[1;32m    206\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mapply_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    207\u001b[0m         \u001b[0;34m\"\"\"Schedule a func to be run\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 208\u001b[0;31m         \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImmediateResult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    209\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    210\u001b[0m             \u001b[0mcallback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, batch)\u001b[0m\n\u001b[1;32m    570\u001b[0m         \u001b[0;31m# Don't delay the application, to avoid keeping the input\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    571\u001b[0m         \u001b[0;31m# arguments in memory\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 572\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    573\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    574\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    250\u001b[0m         \u001b[0;31m# change the default number of processes to -1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    251\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_n_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 252\u001b[0;31m             return [func(*args, **kwargs)\n\u001b[0m\u001b[1;32m    253\u001b[0m                     for func, args, kwargs in self.items]\n\u001b[1;32m    254\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m    250\u001b[0m         \u001b[0;31m# change the default number of processes to -1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    251\u001b[0m         \u001b[0;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_n_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 252\u001b[0;31m             return [func(*args, **kwargs)\n\u001b[0m\u001b[1;32m    253\u001b[0m                     for func, args, kwargs in self.items]\n\u001b[1;32m    254\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/sklearn/pipeline.py\u001b[0m in \u001b[0;36m_fit_transform_one\u001b[0;34m(transformer, X, y, weight, message_clsname, message, **fit_params)\u001b[0m\n\u001b[1;32m    738\u001b[0m     \u001b[0;32mwith\u001b[0m \u001b[0m_print_elapsed_time\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessage_clsname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    739\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mhasattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtransformer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'fit_transform'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 740\u001b[0;31m             \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtransformer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfit_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    741\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    742\u001b[0m             \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtransformer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfit_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/sklearn/base.py\u001b[0m in \u001b[0;36mfit_transform\u001b[0;34m(self, X, y, **fit_params)\u001b[0m\n\u001b[1;32m    688\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0my\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    689\u001b[0m             \u001b[0;31m# fit method of arity 1 (unsupervised transformation)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 690\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mfit_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtransform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    691\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    692\u001b[0m             \u001b[0;31m# fit method of arity 2 (supervised transformation)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/sklearn/preprocessing/_data.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m    665\u001b[0m         \u001b[0;31m# Reset internal state before fitting\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    666\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 667\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpartial_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    668\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    669\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mpartial_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/sklearn/preprocessing/_data.py\u001b[0m in \u001b[0;36mpartial_fit\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m    694\u001b[0m             \u001b[0mTransformer\u001b[0m \u001b[0minstance\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    695\u001b[0m         \"\"\"\n\u001b[0;32m--> 696\u001b[0;31m         X = self._validate_data(X, accept_sparse=('csr', 'csc'),\n\u001b[0m\u001b[1;32m    697\u001b[0m                                 \u001b[0mestimator\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mFLOAT_DTYPES\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    698\u001b[0m                                 force_all_finite='allow-nan')\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/sklearn/base.py\u001b[0m in \u001b[0;36m_validate_data\u001b[0;34m(self, X, y, reset, validate_separately, **check_params)\u001b[0m\n\u001b[1;32m    418\u001b[0m                     \u001b[0;34mf\"requires y to be passed, but the target y is None.\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    419\u001b[0m                 )\n\u001b[0;32m--> 420\u001b[0;31m             \u001b[0mX\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mcheck_params\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    421\u001b[0m             \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    422\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36minner_f\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m     71\u001b[0m                           FutureWarning)\n\u001b[1;32m     72\u001b[0m         \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mparameters\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 73\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     74\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0minner_f\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     75\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mcheck_array\u001b[0;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator)\u001b[0m\n\u001b[1;32m    597\u001b[0m                     \u001b[0marray\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcasting\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"unsafe\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    598\u001b[0m                 \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 599\u001b[0;31m                     \u001b[0marray\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    600\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0mComplexWarning\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    601\u001b[0m                 raise ValueError(\"Complex data not supported\\n\"\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/numpy/core/_asarray.py\u001b[0m in \u001b[0;36masarray\u001b[0;34m(a, dtype, order)\u001b[0m\n\u001b[1;32m     81\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     82\u001b[0m     \"\"\"\n\u001b[0;32m---> 83\u001b[0;31m     \u001b[0;32mreturn\u001b[0m \u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     84\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     85\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: could not convert string to float: ''"
     ]
    }
   ],
   "source": [
    "preprocessing.fit(df_train);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hmmm, one of the numeric features is causing problems?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 7043 entries, 0 to 7042\n",
      "Data columns (total 21 columns):\n",
      " #   Column            Non-Null Count  Dtype  \n",
      "---  ------            --------------  -----  \n",
      " 0   customerID        7043 non-null   object \n",
      " 1   gender            7043 non-null   object \n",
      " 2   SeniorCitizen     7043 non-null   int64  \n",
      " 3   Partner           7043 non-null   object \n",
      " 4   Dependents        7043 non-null   object \n",
      " 5   tenure            7043 non-null   int64  \n",
      " 6   PhoneService      7043 non-null   object \n",
      " 7   MultipleLines     7043 non-null   object \n",
      " 8   InternetService   7043 non-null   object \n",
      " 9   OnlineSecurity    7043 non-null   object \n",
      " 10  OnlineBackup      7043 non-null   object \n",
      " 11  DeviceProtection  7043 non-null   object \n",
      " 12  TechSupport       7043 non-null   object \n",
      " 13  StreamingTV       7043 non-null   object \n",
      " 14  StreamingMovies   7043 non-null   object \n",
      " 15  Contract          7043 non-null   object \n",
      " 16  PaperlessBilling  7043 non-null   object \n",
      " 17  PaymentMethod     7043 non-null   object \n",
      " 18  MonthlyCharges    7043 non-null   float64\n",
      " 19  TotalCharges      7043 non-null   object \n",
      " 20  Churn             7043 non-null   object \n",
      "dtypes: float64(1), int64(2), object(18)\n",
      "memory usage: 1.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Oh, looks like `TotalCharges` is not a numeric type."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "tags": [
     "raises-exception"
    ]
   },
   "outputs": [
    {
     "ename": "ValueError",
     "evalue": "could not convert string to float: ''",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-13-3ec7075e6215>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdf_train\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'TotalCharges'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_train\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'TotalCharges'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36mastype\u001b[0;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[1;32m   5696\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   5697\u001b[0m             \u001b[0;31m# else, only a single dtype is given\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5698\u001b[0;31m             \u001b[0mnew_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_data\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   5699\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_constructor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_data\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__finalize__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   5700\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mastype\u001b[0;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[1;32m    580\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    581\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"raise\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 582\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"astype\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    583\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    584\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mconvert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self, f, filter, **kwargs)\u001b[0m\n\u001b[1;32m    440\u001b[0m                 \u001b[0mapplied\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    441\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 442\u001b[0;31m                 \u001b[0mapplied\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    443\u001b[0m             \u001b[0mresult_blocks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_extend_blocks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mapplied\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult_blocks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    444\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/pandas/core/internals/blocks.py\u001b[0m in \u001b[0;36mastype\u001b[0;34m(self, dtype, copy, errors)\u001b[0m\n\u001b[1;32m    623\u001b[0m             \u001b[0mvals1d\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    624\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 625\u001b[0;31m                 \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mastype_nansafe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvals1d\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    626\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mValueError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    627\u001b[0m                 \u001b[0;31m# e.g. astype_nansafe can fail on object-dtype of strings\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/pandas/core/dtypes/cast.py\u001b[0m in \u001b[0;36mastype_nansafe\u001b[0;34m(arr, dtype, copy, skipna)\u001b[0m\n\u001b[1;32m    895\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mcopy\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mis_object_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mis_object_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    896\u001b[0m         \u001b[0;31m# Explicit copy, or required since NumPy can't view from / to object.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 897\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    898\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    899\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mValueError\u001b[0m: could not convert string to float: ''"
     ]
    }
   ],
   "source": [
    "df_train['TotalCharges'] = df_train['TotalCharges'].astype(float)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Argh!!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " \n",
      " \n",
      " \n",
      " \n",
      " \n",
      " \n",
      " \n",
      " \n"
     ]
    }
   ],
   "source": [
    "for val in df_train['TotalCharges']:\n",
    "    try: \n",
    "        float(val)\n",
    "    except ValueError:\n",
    "        print(val)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Any ideas?\n",
    "\n",
    "<br><br><br><br><br><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Well, it turns out we can't see those problematic values because they are whitespace!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\" \"\n",
      "\" \"\n",
      "\" \"\n",
      "\" \"\n",
      "\" \"\n",
      "\" \"\n",
      "\" \"\n",
      "\" \"\n"
     ]
    }
   ],
   "source": [
    "for val in df_train['TotalCharges']:\n",
    "    try: \n",
    "        float(val)\n",
    "    except ValueError:\n",
    "        print('\"%s\"' % val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train = df_train.assign(TotalCharges=df_train['TotalCharges'].replace(\" \", np.nan).astype(float))\n",
    "df_test = df_test.assign(TotalCharges=df_test['TotalCharges'].replace(\" \", np.nan).astype(float))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = df_train.drop(columns=[\"Churn\"])\n",
    "X_test = df_test.drop(columns=[\"Churn\"])\n",
    "\n",
    "y_train = df_train[\"Churn\"]\n",
    "y_test = df_test[\"Churn\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that worked. But now we need to do imputation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "preprocessing = ColumnTransformer([\n",
    "    ('scale',  make_pipeline(SimpleImputer(strategy='median'), StandardScaler()), numeric_features),\n",
    "    ('ohe',    OneHotEncoder(), categorical_features) \n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's try that again..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "preprocessing.fit(df_train);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_columns = numeric_features + list(preprocessing.named_transformers_['ohe'].get_feature_names(categorical_features))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train_enc = pd.DataFrame(preprocessing.transform(df_train), index=df_train.index, columns=new_columns)\n",
    "X_test_enc  = pd.DataFrame(preprocessing.transform(df_test),  index=df_test.index,  columns=new_columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tenure</th>\n",
       "      <th>MonthlyCharges</th>\n",
       "      <th>TotalCharges</th>\n",
       "      <th>InternetService_DSL</th>\n",
       "      <th>InternetService_Fiber optic</th>\n",
       "      <th>InternetService_No</th>\n",
       "      <th>OnlineSecurity_No</th>\n",
       "      <th>OnlineSecurity_No internet service</th>\n",
       "      <th>OnlineSecurity_Yes</th>\n",
       "      <th>PaymentMethod_Bank transfer (automatic)</th>\n",
       "      <th>...</th>\n",
       "      <th>OnlineBackup_No internet service</th>\n",
       "      <th>OnlineBackup_Yes</th>\n",
       "      <th>PaperlessBilling_No</th>\n",
       "      <th>PaperlessBilling_Yes</th>\n",
       "      <th>Contract_Month-to-month</th>\n",
       "      <th>Contract_One year</th>\n",
       "      <th>Contract_Two year</th>\n",
       "      <th>TechSupport_No</th>\n",
       "      <th>TechSupport_No internet service</th>\n",
       "      <th>TechSupport_Yes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6464</th>\n",
       "      <td>0.707712</td>\n",
       "      <td>0.185175</td>\n",
       "      <td>0.513678</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5707</th>\n",
       "      <td>-1.248999</td>\n",
       "      <td>-0.641538</td>\n",
       "      <td>-0.979562</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3442</th>\n",
       "      <td>-0.148349</td>\n",
       "      <td>1.133562</td>\n",
       "      <td>0.226789</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3932</th>\n",
       "      <td>-1.248999</td>\n",
       "      <td>0.458524</td>\n",
       "      <td>-0.950696</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6124</th>\n",
       "      <td>0.993065</td>\n",
       "      <td>-0.183179</td>\n",
       "      <td>0.433814</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 46 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        tenure  MonthlyCharges  TotalCharges  InternetService_DSL  \\\n",
       "6464  0.707712        0.185175      0.513678                  1.0   \n",
       "5707 -1.248999       -0.641538     -0.979562                  1.0   \n",
       "3442 -0.148349        1.133562      0.226789                  0.0   \n",
       "3932 -1.248999        0.458524     -0.950696                  0.0   \n",
       "6124  0.993065       -0.183179      0.433814                  1.0   \n",
       "\n",
       "      InternetService_Fiber optic  InternetService_No  OnlineSecurity_No  \\\n",
       "6464                          0.0                 0.0                0.0   \n",
       "5707                          0.0                 0.0                1.0   \n",
       "3442                          1.0                 0.0                1.0   \n",
       "3932                          1.0                 0.0                1.0   \n",
       "6124                          0.0                 0.0                0.0   \n",
       "\n",
       "      OnlineSecurity_No internet service  OnlineSecurity_Yes  \\\n",
       "6464                                 0.0                 1.0   \n",
       "5707                                 0.0                 0.0   \n",
       "3442                                 0.0                 0.0   \n",
       "3932                                 0.0                 0.0   \n",
       "6124                                 0.0                 1.0   \n",
       "\n",
       "      PaymentMethod_Bank transfer (automatic)  ...  \\\n",
       "6464                                      1.0  ...   \n",
       "5707                                      0.0  ...   \n",
       "3442                                      0.0  ...   \n",
       "3932                                      0.0  ...   \n",
       "6124                                      0.0  ...   \n",
       "\n",
       "      OnlineBackup_No internet service  OnlineBackup_Yes  PaperlessBilling_No  \\\n",
       "6464                               0.0               1.0                  0.0   \n",
       "5707                               0.0               0.0                  1.0   \n",
       "3442                               0.0               0.0                  0.0   \n",
       "3932                               0.0               0.0                  0.0   \n",
       "6124                               0.0               0.0                  0.0   \n",
       "\n",
       "      PaperlessBilling_Yes  Contract_Month-to-month  Contract_One year  \\\n",
       "6464                   1.0                      1.0                0.0   \n",
       "5707                   0.0                      1.0                0.0   \n",
       "3442                   1.0                      1.0                0.0   \n",
       "3932                   1.0                      1.0                0.0   \n",
       "6124                   1.0                      0.0                1.0   \n",
       "\n",
       "      Contract_Two year  TechSupport_No  TechSupport_No internet service  \\\n",
       "6464                0.0             1.0                              0.0   \n",
       "5707                0.0             1.0                              0.0   \n",
       "3442                0.0             0.0                              0.0   \n",
       "3932                0.0             1.0                              0.0   \n",
       "6124                0.0             0.0                              0.0   \n",
       "\n",
       "      TechSupport_Yes  \n",
       "6464              0.0  \n",
       "5707              0.0  \n",
       "3442              1.0  \n",
       "3932              0.0  \n",
       "6124              1.0  \n",
       "\n",
       "[5 rows x 46 columns]"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_enc.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ok, let's get some scores..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "dc = DummyClassifier(strategy='prior')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "fit_time       0.003828\n",
       "score_time     0.001830\n",
       "test_score     0.740628\n",
       "train_score    0.740629\n",
       "dtype: float64"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(cross_validate(dc, X_train, y_train, return_train_score=True)).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr = make_pipeline(preprocessing, LogisticRegression(max_iter=1000))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "fit_time       0.116107\n",
       "score_time     0.015310\n",
       "test_score     0.804429\n",
       "train_score    0.808690\n",
       "dtype: float64"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(cross_validate(lr, X_train, y_train, return_train_score=True)).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[3516,  396],\n",
       "       [ 637,  733]])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "confusion_matrix(y_train, cross_val_predict(lr, X_train, y_train))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "rf = make_pipeline(preprocessing, RandomForestClassifier())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "fit_time       0.448337\n",
       "score_time     0.034781\n",
       "test_score     0.791368\n",
       "train_score    0.997965\n",
       "dtype: float64"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(cross_validate(rf, X_train, y_train, return_train_score=True)).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[3512,  400],\n",
       "       [ 739,  631]])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "confusion_matrix(y_train, cross_val_predict(rf, X_train, y_train))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And now the rest of the class is about what is wrong with what we just did!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Censoring and survival analysis (15 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "#### Time to event and censoring"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Imagine that you want to analyze _the time until an event occurs_. For example,\n",
    "\n",
    "- the time until a disease kills its host.\n",
    "- the time until a piece of equipment breaks.\n",
    "- the time that someone unemployed will take to land a new job.\n",
    "- the time until a customer leaves a subscription service (this dataset).\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tenure</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6464</th>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5707</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3442</th>\n",
       "      <td>29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3932</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6124</th>\n",
       "      <td>57</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      tenure\n",
       "6464      50\n",
       "5707       2\n",
       "3442      29\n",
       "3932       2\n",
       "6124      57"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train[[\"tenure\"]].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This column is the number of months the customer has stayed with the company."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Although this branch of statistics is usually referred to as **Survival Analysis**, the event in question does not need to be related to actual \"survival\". The important thing is to understand that we are interested in **the time until something happens**, or whether or not something will happen in a certain time frame."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "**Question:** But why is this different? Can't you just use the techniques you learned so far (e.g., regression models) to predict the time? Take a minute to think about this.\n",
    "\n",
    "<br><br><br><br><br><br>\n",
    "\n",
    "The answer would be yes if you could observe the actual time in all occurrences, but you usually cannot. Frequently, there will be some kind of **censoring** which will not allow you to observe the exact time that the event happened for all units/individuals that are being studied."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tenure</th>\n",
       "      <th>Churn</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6464</th>\n",
       "      <td>50</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5707</th>\n",
       "      <td>2</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3442</th>\n",
       "      <td>29</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3932</th>\n",
       "      <td>2</td>\n",
       "      <td>Yes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6124</th>\n",
       "      <td>57</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      tenure Churn\n",
       "6464      50    No\n",
       "5707       2    No\n",
       "3442      29    No\n",
       "3932       2   Yes\n",
       "6124      57    No"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train[[\"tenure\", \"Churn\"]].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- What this means is that we **don't have correct target values** to train or test our model.\n",
    "- This is a problem!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Let's consider some approaches to deal with this censoring issue.\n",
    "\n",
    "#### Approach 1\n",
    "\n",
    "Let's just consider the cases _for which we have the time_, to obtain the average subscription length."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>customerID</th>\n",
       "      <th>gender</th>\n",
       "      <th>SeniorCitizen</th>\n",
       "      <th>Partner</th>\n",
       "      <th>Dependents</th>\n",
       "      <th>tenure</th>\n",
       "      <th>PhoneService</th>\n",
       "      <th>MultipleLines</th>\n",
       "      <th>InternetService</th>\n",
       "      <th>OnlineSecurity</th>\n",
       "      <th>...</th>\n",
       "      <th>DeviceProtection</th>\n",
       "      <th>TechSupport</th>\n",
       "      <th>StreamingTV</th>\n",
       "      <th>StreamingMovies</th>\n",
       "      <th>Contract</th>\n",
       "      <th>PaperlessBilling</th>\n",
       "      <th>PaymentMethod</th>\n",
       "      <th>MonthlyCharges</th>\n",
       "      <th>TotalCharges</th>\n",
       "      <th>Churn</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3932</th>\n",
       "      <td>1304-NECVQ</td>\n",
       "      <td>Female</td>\n",
       "      <td>1</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>2</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Fiber optic</td>\n",
       "      <td>No</td>\n",
       "      <td>...</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>Month-to-month</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Electronic check</td>\n",
       "      <td>78.55</td>\n",
       "      <td>149.55</td>\n",
       "      <td>Yes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>301</th>\n",
       "      <td>8098-LLAZX</td>\n",
       "      <td>Female</td>\n",
       "      <td>1</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>4</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Fiber optic</td>\n",
       "      <td>No</td>\n",
       "      <td>...</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Month-to-month</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Electronic check</td>\n",
       "      <td>95.45</td>\n",
       "      <td>396.10</td>\n",
       "      <td>Yes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5540</th>\n",
       "      <td>3803-KMQFW</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>1</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>No internet service</td>\n",
       "      <td>...</td>\n",
       "      <td>No internet service</td>\n",
       "      <td>No internet service</td>\n",
       "      <td>No internet service</td>\n",
       "      <td>No internet service</td>\n",
       "      <td>Month-to-month</td>\n",
       "      <td>No</td>\n",
       "      <td>Mailed check</td>\n",
       "      <td>20.55</td>\n",
       "      <td>20.55</td>\n",
       "      <td>Yes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4084</th>\n",
       "      <td>2777-PHDEI</td>\n",
       "      <td>Female</td>\n",
       "      <td>0</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>1</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>Fiber optic</td>\n",
       "      <td>No</td>\n",
       "      <td>...</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>Yes</td>\n",
       "      <td>No</td>\n",
       "      <td>Month-to-month</td>\n",
       "      <td>No</td>\n",
       "      <td>Electronic check</td>\n",
       "      <td>78.05</td>\n",
       "      <td>78.05</td>\n",
       "      <td>Yes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3272</th>\n",
       "      <td>6772-KSATR</td>\n",
       "      <td>Male</td>\n",
       "      <td>0</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>1</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Fiber optic</td>\n",
       "      <td>Yes</td>\n",
       "      <td>...</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>No</td>\n",
       "      <td>Month-to-month</td>\n",
       "      <td>Yes</td>\n",
       "      <td>Electronic check</td>\n",
       "      <td>81.70</td>\n",
       "      <td>81.70</td>\n",
       "      <td>Yes</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 21 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      customerID  gender  SeniorCitizen Partner Dependents  tenure  \\\n",
       "3932  1304-NECVQ  Female              1      No         No       2   \n",
       "301   8098-LLAZX  Female              1      No         No       4   \n",
       "5540  3803-KMQFW  Female              0     Yes        Yes       1   \n",
       "4084  2777-PHDEI  Female              0      No         No       1   \n",
       "3272  6772-KSATR    Male              0      No         No       1   \n",
       "\n",
       "     PhoneService MultipleLines InternetService       OnlineSecurity  ...  \\\n",
       "3932          Yes           Yes     Fiber optic                   No  ...   \n",
       "301           Yes           Yes     Fiber optic                   No  ...   \n",
       "5540          Yes            No              No  No internet service  ...   \n",
       "4084          Yes            No     Fiber optic                   No  ...   \n",
       "3272          Yes           Yes     Fiber optic                  Yes  ...   \n",
       "\n",
       "         DeviceProtection          TechSupport          StreamingTV  \\\n",
       "3932                  Yes                   No                   No   \n",
       "301                    No                   No                  Yes   \n",
       "5540  No internet service  No internet service  No internet service   \n",
       "4084                   No                   No                  Yes   \n",
       "3272                   No                   No                   No   \n",
       "\n",
       "          StreamingMovies        Contract PaperlessBilling     PaymentMethod  \\\n",
       "3932                   No  Month-to-month              Yes  Electronic check   \n",
       "301                   Yes  Month-to-month              Yes  Electronic check   \n",
       "5540  No internet service  Month-to-month               No      Mailed check   \n",
       "4084                   No  Month-to-month               No  Electronic check   \n",
       "3272                   No  Month-to-month              Yes  Electronic check   \n",
       "\n",
       "     MonthlyCharges  TotalCharges  Churn  \n",
       "3932          78.55        149.55    Yes  \n",
       "301           95.45        396.10    Yes  \n",
       "5540          20.55         20.55    Yes  \n",
       "4084          78.05         78.05    Yes  \n",
       "3272          81.70         81.70    Yes  \n",
       "\n",
       "[5 rows x 21 columns]"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_churn = df_train.query(\"Churn == 'Yes'\")\n",
    "df_test_churn = df_test.query(\"Churn == 'Yes'\")\n",
    "df_train_churn.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(5282, 21)"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1370, 21)"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_churn.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "preprocessing_notenure = ColumnTransformer([\n",
    "    ('scale',  make_pipeline(SimpleImputer(strategy='median'), StandardScaler()), numeric_features[1:]),\n",
    "    ('ohe',    OneHotEncoder(), categorical_features) \n",
    "])\n",
    "\n",
    "tenure_lm = make_pipeline(preprocessing_notenure, Ridge())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "tenure_lm.fit(df_train_churn.drop(columns=[\"tenure\"]), df_train_churn[\"tenure\"]);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 5.06220341, 13.19842594, 11.86000915,  5.86549339, 58.15531207,\n",
       "        3.75777597, 18.93218848,  7.72057413, 36.81845697,  7.26344075])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tenure_lm.predict(df_test_churn.drop(columns=[\"tenure\"]))[:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What will be wrong with our estimated survival times? Will they be too low or too high? \n",
    "<br><br><br><br><br><br><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "On average they will be **underestimates** (too small), because we are ignoring the currently subscribed (un-churned) customers. Our dataset is a biased sample of those who churned within the time window of the data collection. Long-time subscribers were more likely to be removed from the dataset! This is a common mistake - see the Calling Bullshit video I posted on the README!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Approach 2\n",
    "\n",
    "Assume everyone churns right now - in other words, use the original dataset. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "tenure_lm.fit(df_train.drop(columns=[\"tenure\"]), df_train[\"tenure\"]);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([20.56929697, 40.65520509, 31.52902413, 36.16312437, 41.8706012 ,\n",
       "       37.98663577, 17.47753169, 54.68983917, 48.1412576 , 71.23988875])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tenure_lm.predict(df_test.drop(columns=[\"tenure\"]))[:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "What will be wrong with our estimated survival time?\n",
    "<br><br><br><br><br><br>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tenure</th>\n",
       "      <th>Churn</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6464</th>\n",
       "      <td>50</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5707</th>\n",
       "      <td>2</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3442</th>\n",
       "      <td>29</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3932</th>\n",
       "      <td>2</td>\n",
       "      <td>Yes</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6124</th>\n",
       "      <td>57</td>\n",
       "      <td>No</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      tenure Churn\n",
       "6464      50    No\n",
       "5707       2    No\n",
       "3442      29    No\n",
       "3932       2   Yes\n",
       "6124      57    No"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train[[\"tenure\", \"Churn\"]].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It will be an **underestimate** again. For those still subscribed, while we did not remove them, we recorded a total tenure shorter than in reality, because they will keep going for some amount of time. because we have a bunch of churns \"now\" that did not actually happen."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Approach 3\n",
    "\n",
    "Deal with this properly using [survival analysis](https://en.wikipedia.org/wiki/Survival_analysis).\n",
    "\n",
    "- You may learn about this in a statistics course.\n",
    "- We will use the `lifelines` package in Python and will not go into the math/stats of how it works."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Types of questions we might want to answer:\n",
    "\n",
    "1. How long do customers stay with the service? \n",
    "2. What factors influence a customer's churn time?\n",
    "3. For a particular customer, can we predict how long they might stay with the service?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Break (5 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "REMINDER TO TURN ON RECORDING"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Kaplan-Meier survival curve (10 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Before we do anything further, I want to modify our dataset slightly:\n",
    "\n",
    "1. I'm going to drop the `TotalCharges` (yes, after all that work fixing it) because it's a bit of a strange feature.\n",
    "  - Its value actually changes over time, but we only have the value at the end.\n",
    "  - We still have `MonthlyCharges`.\n",
    "2. I'm going to not scale the `tenure` column, since it will be convenient to keep it in its original units of months. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['tenure', 'MonthlyCharges', 'TotalCharges']"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "numeric_features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "preprocessing_final = make_column_transformer(\n",
    "    ('passthrough', ['tenure']), \n",
    "    (FunctionTransformer(lambda x: x == \"Yes\"), ['Churn']),\n",
    "    ('drop', ['TotalCharges']),\n",
    "    (StandardScaler(), ['MonthlyCharges']),\n",
    "    (OneHotEncoder(drop='if_binary'), categorical_features) \n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "preprocessing_final.fit(df_train);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_columns = ['tenure', 'Churn', 'MonthlyCharges'] + list(preprocessing_final.named_transformers_['onehotencoder'].get_feature_names(categorical_features))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train_surv = pd.DataFrame(preprocessing_final.transform(df_train), index=df_train.index, columns=new_columns)\n",
    "df_test_surv  = pd.DataFrame(preprocessing_final.transform(df_test),  index=df_test.index,  columns=new_columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tenure</th>\n",
       "      <th>Churn</th>\n",
       "      <th>MonthlyCharges</th>\n",
       "      <th>InternetService_DSL</th>\n",
       "      <th>InternetService_Fiber optic</th>\n",
       "      <th>InternetService_No</th>\n",
       "      <th>OnlineSecurity_No</th>\n",
       "      <th>OnlineSecurity_No internet service</th>\n",
       "      <th>OnlineSecurity_Yes</th>\n",
       "      <th>PaymentMethod_Bank transfer (automatic)</th>\n",
       "      <th>...</th>\n",
       "      <th>OnlineBackup_No</th>\n",
       "      <th>OnlineBackup_No internet service</th>\n",
       "      <th>OnlineBackup_Yes</th>\n",
       "      <th>PaperlessBilling_Yes</th>\n",
       "      <th>Contract_Month-to-month</th>\n",
       "      <th>Contract_One year</th>\n",
       "      <th>Contract_Two year</th>\n",
       "      <th>TechSupport_No</th>\n",
       "      <th>TechSupport_No internet service</th>\n",
       "      <th>TechSupport_Yes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6464</th>\n",
       "      <td>50.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.185175</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5707</th>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.641538</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3442</th>\n",
       "      <td>29.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.133562</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3932</th>\n",
       "      <td>2.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.458524</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6124</th>\n",
       "      <td>57.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-0.183179</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 40 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      tenure  Churn  MonthlyCharges  InternetService_DSL  \\\n",
       "6464    50.0    0.0        0.185175                  1.0   \n",
       "5707     2.0    0.0       -0.641538                  1.0   \n",
       "3442    29.0    0.0        1.133562                  0.0   \n",
       "3932     2.0    1.0        0.458524                  0.0   \n",
       "6124    57.0    0.0       -0.183179                  1.0   \n",
       "\n",
       "      InternetService_Fiber optic  InternetService_No  OnlineSecurity_No  \\\n",
       "6464                          0.0                 0.0                0.0   \n",
       "5707                          0.0                 0.0                1.0   \n",
       "3442                          1.0                 0.0                1.0   \n",
       "3932                          1.0                 0.0                1.0   \n",
       "6124                          0.0                 0.0                0.0   \n",
       "\n",
       "      OnlineSecurity_No internet service  OnlineSecurity_Yes  \\\n",
       "6464                                 0.0                 1.0   \n",
       "5707                                 0.0                 0.0   \n",
       "3442                                 0.0                 0.0   \n",
       "3932                                 0.0                 0.0   \n",
       "6124                                 0.0                 1.0   \n",
       "\n",
       "      PaymentMethod_Bank transfer (automatic)  ...  OnlineBackup_No  \\\n",
       "6464                                      1.0  ...              0.0   \n",
       "5707                                      0.0  ...              1.0   \n",
       "3442                                      0.0  ...              1.0   \n",
       "3932                                      0.0  ...              1.0   \n",
       "6124                                      0.0  ...              1.0   \n",
       "\n",
       "      OnlineBackup_No internet service  OnlineBackup_Yes  \\\n",
       "6464                               0.0               1.0   \n",
       "5707                               0.0               0.0   \n",
       "3442                               0.0               0.0   \n",
       "3932                               0.0               0.0   \n",
       "6124                               0.0               0.0   \n",
       "\n",
       "      PaperlessBilling_Yes  Contract_Month-to-month  Contract_One year  \\\n",
       "6464                   1.0                      1.0                0.0   \n",
       "5707                   0.0                      1.0                0.0   \n",
       "3442                   1.0                      1.0                0.0   \n",
       "3932                   1.0                      1.0                0.0   \n",
       "6124                   1.0                      0.0                1.0   \n",
       "\n",
       "      Contract_Two year  TechSupport_No  TechSupport_No internet service  \\\n",
       "6464                0.0             1.0                              0.0   \n",
       "5707                0.0             1.0                              0.0   \n",
       "3442                0.0             0.0                              0.0   \n",
       "3932                0.0             1.0                              0.0   \n",
       "6124                0.0             0.0                              0.0   \n",
       "\n",
       "      TechSupport_Yes  \n",
       "6464              0.0  \n",
       "5707              0.0  \n",
       "3442              1.0  \n",
       "3932              0.0  \n",
       "6124              1.0  \n",
       "\n",
       "[5 rows x 40 columns]"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_surv.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "kmf = lifelines.KaplanMeierFitter()\n",
    "kmf.fit(df_train_surv[\"tenure\"], df_train_surv[\"Churn\"]);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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776jT58+dOzYkW+++YYKFSocN79MmTJceumljBgx4rjpI0aMoH///rm6EykrK4tnn32W5s2bk5iYSK1atfjrX/96XJuLrKwsHn30URo1akRSUhLVqlWja9eu/PTTT8CxO6AGDx6MiCAiDBo0CDjxktfKlSsREd544w0efPBBatSoQXJyMv369SMzM5OlS5fSq1cvypcvT+PGjRk2bNhx8S5dupT+/fvToEEDypQpQ8OGDbn99tvZvv1YW+6ePXsyceJEfv7556Px9OzZ8+j8FStWcO2115KSkkJiYiLt2rUr8FKU3fwepsap7k6vJZt2c0rDqjGOxhR3T3w+j/nrd8U0hpa1KvD4+a3ytI1x48YxcOBAevbsyaeffkqZMmUCLnfddddx5plnsnbtWurUqcPUqVNZvHgx/fv3Z+LEiRHvt1+/fnz++ecMHDiQLl26sGDBAh599FFWrlx5tCT0/PPP89JLLzF48GDatWvHrl27mDZtGtu2uSZtU6ZM4dRTT2XAgAHceuutANSpUyfkfp999ll69uzJsGHDmD9/Pvfffz9xcXHMnDmTm2++mfvuu4///Oc/3HDDDaSnp9OqlTu+69evp06dOrz88stUrlyZ5cuX88wzz9C3b1+mTJkCwOuvv06/fv04fPgwb775JsDR5LxmzRpOOeUUUlNTeemll0hJSWH06NFceumlfPbZZ1xwQcH0nWsJJUxNq7vruEsy9lhCMSZM99xzD40aNWLMmDEkJiYGXa5Hjx7UrVuXkSNH8sADDzB8+HC6dOlC48aNI97n5MmTGT16NMOGDeO6664D4KyzzqJKlSr069ePWbNm0a5dO6ZMmcI555zD3XfffXTd888//+jfnTt3BqB27dpH/85Jo0aNjpY+evXqxeTJkxkxYgQjRoygX79+AKSnpzN27Fg++uijowmle/fudO9+bGin7PferVs3Zs6cSfv27WnZsiUVKlQgKyvrhHgGDRqEqjJx4kSqVq16dP9r1qzhscces4RS2NSsmES50qWsHsUUiLyWDAqLc889l3HjxvHss88evVwUiIjQr18/RowYwb333svo0aN55plncrXPr7/+mtKlS3PppZce1wr8nHPcSBmTJk2iXbt2dOzYkWeffZaHH36YPn360KlTJ0qXLp2rfWbr06fPca+bN28OuJN7tsqVK5OamsqaNWuOTjt48CAvvPACw4cPZ9WqVcddmlu0aFGO9TVff/01ffv2pWLFise95169evG3v/2NXbt2nXCpMT9YQgmTiNC4erLd6WVMBF566SVq1KjBE088QVJSEg888EDQZa+77joGDx7ME088wd69e7nyyitztc+MjAwOHjwYtH+0rVu3AvDQQw+RlJTEyJEjeeaZZyhfvjyXXXYZ//jHP47egRYp35sNgKMJKtB036Tx4IMP8sorr/DYY4/RpUsXkpOTWbt2LZdccklYfW1lZGQwfPhwhg8fHnD+1q1bLaEUNk1SyzNxcfR65jSmuBMRhgwZwoEDB3jwwQdJSkrinnvuCbhs06ZNOeWUU3juuee45JJLqFSpUq72WbVqVZKSkpg8OfCAsLVq1QIgISGBgQMHMnDgQDZu3MgXX3zBvffeS2ZmJqNHjw64bn4ZNWoU1113HY888sjRaXv2hH81pGrVqnTr1o2BAwcGnJ/9nvObJZQINEktz0fT17Ij8yCVyuataGxMSREXF8fQoUM5ePAgf/nLX0hKSuK2224LuOz999/P8OHDufPOO3O9v969e/P888+zc+dOzjzzzLDWqVGjBjfddBNffvklc+fOPTq9dOnS7Nu3L9exhCszM5OEhITjpr3zzjsnLJeYmHhCex1w73nKlCm0atUq6I0PBcESSgSyK+aXZuwhPS3g8CvGmABKlSrFu+++y4EDB/jzn/9MYmIiN9xwwwnLXXLJJVxyySV52lfPnj25+uqrueyyy7j33nvp1KkTcXFxrFy5ki+//JLnn3+epk2bcuGFF3LSSSfRoUMHKleuzMyZM/n666+P3tEF0LJlS8aNG0fv3r2pXLkytWrVypdf+71792bYsGG0adOGxo0b88knn/DLL7+csFzLli15/fXXGT16NI0aNSI5OZlmzZrx5JNP0qlTJ7p3786dd95JWloa27dvZ+7cuSxfvrzAGkNaQonA0VuHLaEYE7H4+Hg++OADLrroIm666aaQd33l1ciRI3nllVd4++23GTx4MImJiaSlpdGrVy+qV68OuDurPvzwQ1577TUyMzOpV68e999/Pw8//PDR7bz66qvcddddnH/++Rw4cIDHH3885M0FufXKK6+gqkf33bdvX95//306dep03HIDBw5k0aJF3HTTTezZs4cePXrw448/Uq9ePaZNm8agQYN46KGH2Lx5M1Wr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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "kmf.survival_function_.plot()\n",
    "plt.title('Survival function of customer churn');\n",
    "plt.xlabel('Time with service (months)');\n",
    "plt.ylabel('Survival probability');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- What is this plot telling us?\n",
    "- It is the probability of survival over time.\n",
    "- This is around 0.6 at the end, but..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7406285497917455"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(y_train == 'No')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "32.6391518364256"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(df_train_surv[\"tenure\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "17.854744525547446"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(df_train_surv.query(\"Churn == '1'\")[\"tenure\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "37.816717791411044"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(df_train_surv.query(\"Churn == '0'\")[\"tenure\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- ...but 73% of customers \"survived\" (did not churn) in our dataset. So, shouldn't our plot go down to 73%.\n",
    "- It goes lower, to ~60%, because some customers churned in less than 70 months.\n",
    "- Thus, the _probability_ of churning in 70 months is larger than our fraction who churned.\n",
    "  - Or, conversely, the probability of survival after 70 months is lower than the fraction of stayed."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The key point here is that people _joined at different times_:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df_train[y_train == 'No'][\"tenure\"].hist(grid=False);\n",
    "plt.xlabel('months');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Since the data was collected at a fixed time and these are the people who hadn't yet churned, those with larger `tenure` values here must have joined earlier.\n",
    "- This is a bit subtle but an important point - questions?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lifelines can also give us some \"error bars\":"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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FlAjRoxARBARhg4dClQv8pozZw4iwn333ceQIUPYZpttaN68Of3792fVqlV8/vnn9OnThy233JKuXbsyZsyYKun9/PPPGTBgADvssANNmzalc+fOXHTRRSxZsrkvd+/evZk6dSpvvvlmZXp69+5duX727NmceeaZtGvXjsaNG9O9e/ei56Ks8bsxNVDYcD/F1m3bFtU69WZr0qRJDB48mN69e/PUU0/RtGnT0O0GDhzI4Ycfzvz58+nYsSPTp0/nf//7HwMGDGDq1KlZn7d///48++yzDB48mAMOOIBPPvmE6667jjlz5lTmhG699VbuvPNORowYQffu3Vm2bBkzZsxg8WLXpW3atGnsv//+nH322fzqV78CoGPHjmnPO3LkSHr37s2YMWP4+OOPufLKK6lXrx7vvfce559/PldccQX33nsv55xzDj169GC33dz1/eabb+jYsSN33XUXrVq14ssvv+Tmm2/mmGOOYdq0aQDcc8899O/fn40bN3L//fcDVAbnefPmse+++9K+fXvuvPNO2rVrx4QJEzjllFN4+umnOeGE4oydawHFGFMwgwYNokuXLjzzzDM0btw45Xa9evViu+22Y/z48Vx11VWMHTuWAw44gK5du2Z9ztdff50JEyYwZswYBg4cCMARRxxB69at6d+/P++//z7du3dn2rRpHHXUUVx22WWV+x5//PGVf++3334AdOjQofLvTLp06VKZ++jTpw+vv/4648aNY9y4cfTv3x+AHj16MHHiRP7xj39UBpRDDjmEQw7ZPLVT4r0ffPDBvPfee+y1115069aNFi1asGHDhmrpGTp0KKrK1KlTadOmTeX5582bx/XXX28BxZi6LN+cQU1x7LHHMmnSJEaOHFlZXBRGROjfvz/jxo3j8ssvZ8KECdx88805nfOFF16gUaNGnHLKKVV6gR91lJsp47XXXqN79+7ss88+jBw5kmuuuYajjz6anj170qhRo5zOmXD00UdXeb3LLrsA7uae0KpVK9q3b8+8efMql61bt47bb7+dsWPHMnfu3CpFc7NmzcpYX/PCCy9wzDHH0LJlyyrvuU+fPvzud79j2bJl1YoaC8ECijGmYO6880622WYbhg0bRpMmTbjqqqtSbjtw4EBGjBjBsGHDWLlyJaeddlpO5/zhhx9Yt24dW265Zej6xNhVV199NU2aNGH8+PHcfPPNbLnllpx66qncdtttlS3QspXc2ACoDFBhy5ODxpAhQ7j77ru5/vrrOeCAA2jevDnz58/n5JNPrrJdKj/88ANjx45l7NixoesXLVpkAcUYU95EhFGjRrF27VqGDBlCkyZNGDRoUOi2O+20E/vuuy+33HILJ598MltttVVO52zTpg1NmjTh9dfDJ4TddtttAWjYsCGDBw9m8ODBfPfdd/zzn//k8ssvZ9WqVUyYMCF030J57LHHGDhwINdee23lshUrVkTev02bNhx88MEMHjw4dH3iPReaBRRjTEHVq1eP0aNHs27dOn7zm9/QpEkTLrzwwtBtr7zySsaOHcsll1yS8/n69u3LrbfeytKlSzn88MMj7bPNNttw3nnn8dxzz/HRRx9VLm/UqBGrV6/OOS1RrVq1ioYNG1ZZ9tBDD1XbrnHjxtX664B7z9OmTWO33XZL2fChGCygGGMKrn79+jz88MOsXbuWiy++mMaNG3POOedU2+7kk0/m5JNPzutcvXv35vTTT+fUU0/l8ssvp2fPntSrV485c+bw3HPPceutt7LTTjvRr18/9txzT/bee29atWrFe++9xwsvvFDZogugW7duTJo0ib59+9KqVSu23Xbbgvza79u3L2PGjGH33Xena9euPPnkk7z11lvVtuvWrRv33HMPEyZMoEuXLjRv3pydd96Z4cOH07NnTw455BAuueQSKioqWLJkCR999BFffvll0TpDWkAxxhRFgwYN+Pvf/86JJ57Ieeedl7bVV77Gjx/P3XffzYMPPsiIESNo3LgxFRUV9OnTh6233hpwLasef/xx/vKXv7Bq1So6derElVdeyTXXXFN5nD//+c9ceumlHH/88axdu5YbbrghbeOCXN19992oauW5jznmGB599FF69uxZZbvBgwcza9YszjvvPFasWEGvXr2YMmUKnTp1YsaMGQwdOpSrr76aBQsW0KZNG376059y1llnxZ7eVEQ1pzmnylKPHj10xowZeR8nMcHW85cdknljYzL45JNP2HXXXUudDFNHZfr+icg7qtojyrGsp7wxxphYWJGXMaZsbNy4kXSlKvXq1aNePfudXCp25Y0xZePwww+nYcOGKR/nnntuqZNYp1kOJUcbNykT3/+68nXzpg05dOf2JUyRMbXf/fffH9psNiHXDokmHpECioicDzyiqisLnJ6ysWmT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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "kmf.plot();\n",
    "plt.title('Survival function of customer churn');\n",
    "plt.xlabel('Time with service (months)');\n",
    "plt.ylabel('Survival probability');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- We already have some actionable information here.\n",
    "- BTW, the [original paper by Kaplan and Meier](https://web.stanford.edu/~lutian/coursepdf/KMpaper.pdf) has been cited over 57000 times!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also create the K-M curve for different subgroups:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "T = df_train_surv[\"tenure\"]\n",
    "E = df_train_surv[\"Churn\"]\n",
    "senior = df_train_surv[\"SeniorCitizen_1\"] == 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ax = plt.subplot(111)\n",
    "\n",
    "kmf.fit(T[senior], event_observed=E[senior], label=\"Senior Citizens\")\n",
    "kmf.plot(ax=ax)\n",
    "\n",
    "kmf.fit(T[~senior], event_observed=E[~senior], label=\"Non-Senior Citizens\")\n",
    "kmf.plot(ax=ax)\n",
    "\n",
    "plt.ylim(0, 1);\n",
    "plt.xlabel('Time with service (months)');\n",
    "plt.ylabel('Survival probability');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- It looks like senior citizens churn more quickly than others.\n",
    "- This is quite useful!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Cox proportional hazards model (10 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- The Cox proportional hazards model is a commonly used model that allows us to interpret how features influence a censored tenure/duration. \n",
    "- You can think of it like linear regression for survival analysis: we will get a coefficient for each feature that tells us how it influences survival.\n",
    "- It makes some strong assumptions (the proportional hazards assumption) that may not be true, but we won't go into this here.\n",
    "- The proportional hazard model works multiplicatively, like linear regression with log-transformed targets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "tags": [
     "raises-exception"
    ]
   },
   "outputs": [
    {
     "ename": "ConvergenceError",
     "evalue": "Convergence halted due to matrix inversion problems. Suspicion is high collinearity. Please see the following tips in the lifelines documentation: https://lifelines.readthedocs.io/en/latest/Examples.html#problems-with-convergence-in-the-cox-proportional-hazard-modelMatrix is singular.",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mLinAlgError\u001b[0m                               Traceback (most recent call last)",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/lifelines/fitters/coxph_fitter.py\u001b[0m in \u001b[0;36m_newton_rhapson_for_efron_model\u001b[0;34m(self, X, T, E, weights, entries, initial_point, step_size, precision, show_progress, max_steps)\u001b[0m\n\u001b[1;32m   1184\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1185\u001b[0;31m                 \u001b[0minv_h_dot_g_T\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mspsolve\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mh\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0massume_a\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"pos\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcheck_finite\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1186\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mValueError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mLinAlgError\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/scipy/linalg/basic.py\u001b[0m in \u001b[0;36msolve\u001b[0;34m(a, b, sym_pos, lower, overwrite_a, overwrite_b, debug, check_finite, assume_a, transposed)\u001b[0m\n\u001b[1;32m    247\u001b[0m                            overwrite_b=overwrite_b)\n\u001b[0;32m--> 248\u001b[0;31m         \u001b[0m_solve_check\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minfo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    249\u001b[0m         \u001b[0mrcond\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minfo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpocon\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlu\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0manorm\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/scipy/linalg/basic.py\u001b[0m in \u001b[0;36m_solve_check\u001b[0;34m(n, info, lamch, rcond)\u001b[0m\n\u001b[1;32m     28\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0minfo\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 29\u001b[0;31m         \u001b[0;32mraise\u001b[0m \u001b[0mLinAlgError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Matrix is singular.'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     30\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mLinAlgError\u001b[0m: Matrix is singular.",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[0;31mConvergenceError\u001b[0m                          Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-77-ae0c946a049b>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mcph\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlifelines\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mCoxPHFitter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mcph\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_train_surv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mduration_col\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'tenure'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mevent_col\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Churn'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m;\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/lifelines/utils/__init__.py\u001b[0m in \u001b[0;36mf\u001b[0;34m(model, *args, **kwargs)\u001b[0m\n\u001b[1;32m     52\u001b[0m         \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     53\u001b[0m             \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_censoring_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mRIGHT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 54\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     55\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     56\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/lifelines/fitters/coxph_fitter.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, df, duration_col, event_col, show_progress, initial_point, strata, step_size, weights_col, cluster_col, robust, batch_mode, timeline, formula, entry_col)\u001b[0m\n\u001b[1;32m    274\u001b[0m         \"\"\"\n\u001b[1;32m    275\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mutils\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcoalesce\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstrata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 276\u001b[0;31m         self._model = self._fit_model(\n\u001b[0m\u001b[1;32m    277\u001b[0m             \u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    278\u001b[0m             \u001b[0mduration_col\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/lifelines/fitters/coxph_fitter.py\u001b[0m in \u001b[0;36m_fit_model\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    307\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_fit_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    308\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbaseline_estimation_method\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"breslow\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 309\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit_model_breslow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    310\u001b[0m         \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbaseline_estimation_method\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"spline\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    311\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit_model_spline\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/lifelines/fitters/coxph_fitter.py\u001b[0m in \u001b[0;36m_fit_model_breslow\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    319\u001b[0m             \u001b[0mpenalizer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpenalizer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0ml1_ratio\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0ml1_ratio\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstrata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0malpha\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0malpha\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_label\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    320\u001b[0m         )\n\u001b[0;32m--> 321\u001b[0;31m         \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    322\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    323\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/lifelines/utils/__init__.py\u001b[0m in \u001b[0;36mf\u001b[0;34m(model, *args, **kwargs)\u001b[0m\n\u001b[1;32m     52\u001b[0m         \u001b[0;32mdef\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     53\u001b[0m             \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_censoring_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mRIGHT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 54\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mfunction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     55\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     56\u001b[0m         \u001b[0;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/lifelines/fitters/coxph_fitter.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, df, duration_col, event_col, show_progress, initial_point, strata, step_size, weights_col, cluster_col, robust, batch_mode, timeline, formula, entry_col)\u001b[0m\n\u001b[1;32m    915\u001b[0m         )\n\u001b[1;32m    916\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 917\u001b[0;31m         params_, ll_, variance_matrix_, baseline_hazard_, baseline_cumulative_hazard_, model = self._fit_model(\n\u001b[0m\u001b[1;32m    918\u001b[0m             \u001b[0mX_norm\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    919\u001b[0m             \u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/lifelines/fitters/coxph_fitter.py\u001b[0m in \u001b[0;36m_fit_model\u001b[0;34m(self, X, T, E, weights, entries, initial_point, step_size, show_progress)\u001b[0m\n\u001b[1;32m   1040\u001b[0m         \u001b[0mshow_progress\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbool\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1041\u001b[0m     ):\n\u001b[0;32m-> 1042\u001b[0;31m         beta_, ll_, hessian_ = self._newton_rhapson_for_efron_model(\n\u001b[0m\u001b[1;32m   1043\u001b[0m             \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mE\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweights\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mentries\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minitial_point\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_point\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstep_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstep_size\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mshow_progress\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mshow_progress\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1044\u001b[0m         )\n",
      "\u001b[0;32m/opt/miniconda3/envs/cpsc330env/lib/python3.8/site-packages/lifelines/fitters/coxph_fitter.py\u001b[0m in \u001b[0;36m_newton_rhapson_for_efron_model\u001b[0;34m(self, X, T, E, weights, entries, initial_point, step_size, precision, show_progress, max_steps)\u001b[0m\n\u001b[1;32m   1192\u001b[0m                     )\n\u001b[1;32m   1193\u001b[0m                 \u001b[0;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mLinAlgError\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1194\u001b[0;31m                     raise exceptions.ConvergenceError(\n\u001b[0m\u001b[1;32m   1195\u001b[0m                         \"\"\"Convergence halted due to matrix inversion problems. Suspicion is high collinearity. {0}\"\"\".format(\n\u001b[1;32m   1196\u001b[0m                             \u001b[0mCONVERGENCE_DOCS\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mConvergenceError\u001b[0m: Convergence halted due to matrix inversion problems. Suspicion is high collinearity. Please see the following tips in the lifelines documentation: https://lifelines.readthedocs.io/en/latest/Examples.html#problems-with-convergence-in-the-cox-proportional-hazard-modelMatrix is singular."
     ]
    }
   ],
   "source": [
    "cph = lifelines.CoxPHFitter()\n",
    "cph.fit(df_train_surv, duration_col='tenure', event_col='Churn');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](img/mike_funtimes.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Ok, going that [that URL](https://lifelines.readthedocs.io/en/latest/Examples.html#problems-with-convergence-in-the-cox-proportional-hazard-model), it seems the easiest solution is to add a penalizer.\n",
    "  - FYI this is related to switching from `LinearRegression` to `Ridge`.\n",
    "  - Adding `drop='first'` on our OHE might have helped with this.\n",
    "  - (For 340 folks: we're adding regularization; `lifelines` adds both L1 and L2 regularization, aka elastic net)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [],
   "source": [
    "cph = lifelines.CoxPHFitter(penalizer=0.1)\n",
    "cph.fit(df_train_surv, duration_col='tenure', event_col='Churn');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>coef</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>covariate</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Contract_Month-to-month</th>\n",
       "      <td>0.817158</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>OnlineSecurity_No</th>\n",
       "      <td>0.313812</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>OnlineBackup_No</th>\n",
       "      <td>0.300171</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PaymentMethod_Electronic check</th>\n",
       "      <td>0.281481</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>TechSupport_No</th>\n",
       "      <td>0.212638</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PaymentMethod_Credit card (automatic)</th>\n",
       "      <td>-0.301786</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>OnlineSecurity_Yes</th>\n",
       "      <td>-0.332959</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Contract_One year</th>\n",
       "      <td>-0.353184</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Partner_Yes</th>\n",
       "      <td>-0.413941</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Contract_Two year</th>\n",
       "      <td>-0.780959</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>38 rows × 1 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                           coef\n",
       "covariate                                      \n",
       "Contract_Month-to-month                0.817158\n",
       "OnlineSecurity_No                      0.313812\n",
       "OnlineBackup_No                        0.300171\n",
       "PaymentMethod_Electronic check         0.281481\n",
       "TechSupport_No                         0.212638\n",
       "...                                         ...\n",
       "PaymentMethod_Credit card (automatic) -0.301786\n",
       "OnlineSecurity_Yes                    -0.332959\n",
       "Contract_One year                     -0.353184\n",
       "Partner_Yes                           -0.413941\n",
       "Contract_Two year                     -0.780959\n",
       "\n",
       "[38 rows x 1 columns]"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cph_params = pd.DataFrame(cph.params_)\n",
    "cph_params.sort_values(by=\"coef\", ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- We can start to interpret these! \n",
    "- Looks like month-to-month leads to more churn, two-year contract leads to less churn; this makes sense!!!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# cph.baseline_hazard_ # baseline hazard"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>coef</th>\n",
       "      <th>exp(coef)</th>\n",
       "      <th>se(coef)</th>\n",
       "      <th>coef lower 95%</th>\n",
       "      <th>coef upper 95%</th>\n",
       "      <th>exp(coef) lower 95%</th>\n",
       "      <th>exp(coef) upper 95%</th>\n",
       "      <th>z</th>\n",
       "      <th>p</th>\n",
       "      <th>-log2(p)</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>covariate</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>MonthlyCharges</th>\n",
       "      <td>-0.003597</td>\n",
       "      <td>0.996409</td>\n",
       "      <td>0.040010</td>\n",
       "      <td>-0.082015</td>\n",
       "      <td>0.074820</td>\n",
       "      <td>0.921258</td>\n",
       "      <td>1.077691</td>\n",
       "      <td>-0.089912</td>\n",
       "      <td>9.283573e-01</td>\n",
       "      <td>0.107248</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>InternetService_DSL</th>\n",
       "      <td>-0.160578</td>\n",
       "      <td>0.851651</td>\n",
       "      <td>0.072205</td>\n",
       "      <td>-0.302097</td>\n",
       "      <td>-0.019060</td>\n",
       "      <td>0.739267</td>\n",
       "      <td>0.981121</td>\n",
       "      <td>-2.223935</td>\n",
       "      <td>2.615284e-02</td>\n",
       "      <td>5.256889</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>InternetService_Fiber optic</th>\n",
       "      <td>0.186995</td>\n",
       "      <td>1.205622</td>\n",
       "      <td>0.071461</td>\n",
       "      <td>0.046934</td>\n",
       "      <td>0.327057</td>\n",
       "      <td>1.048053</td>\n",
       "      <td>1.386880</td>\n",
       "      <td>2.616742</td>\n",
       "      <td>8.877350e-03</td>\n",
       "      <td>6.815655</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>InternetService_No</th>\n",
       "      <td>-0.058015</td>\n",
       "      <td>0.943636</td>\n",
       "      <td>0.100965</td>\n",
       "      <td>-0.255901</td>\n",
       "      <td>0.139872</td>\n",
       "      <td>0.774218</td>\n",
       "      <td>1.150127</td>\n",
       "      <td>-0.574603</td>\n",
       "      <td>5.655596e-01</td>\n",
       "      <td>0.822249</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>OnlineSecurity_No</th>\n",
       "      <td>0.313812</td>\n",
       "      <td>1.368632</td>\n",
       "      <td>0.069632</td>\n",
       "      <td>0.177335</td>\n",
       "      <td>0.450288</td>\n",
       "      <td>1.194032</td>\n",
       "      <td>1.568764</td>\n",
       "      <td>4.506713</td>\n",
       "      <td>6.583963e-06</td>\n",
       "      <td>17.212612</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Contract_One year</th>\n",
       "      <td>-0.353184</td>\n",
       "      <td>0.702448</td>\n",
       "      <td>0.077743</td>\n",
       "      <td>-0.505558</td>\n",
       "      <td>-0.200809</td>\n",
       "      <td>0.603169</td>\n",
       "      <td>0.818068</td>\n",
       "      <td>-4.542944</td>\n",
       "      <td>5.547410e-06</td>\n",
       "      <td>17.459754</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Contract_Two year</th>\n",
       "      <td>-0.780959</td>\n",
       "      <td>0.457967</td>\n",
       "      <td>0.081116</td>\n",
       "      <td>-0.939943</td>\n",
       "      <td>-0.621974</td>\n",
       "      <td>0.390650</td>\n",
       "      <td>0.536884</td>\n",
       "      <td>-9.627673</td>\n",
       "      <td>6.109722e-22</td>\n",
       "      <td>70.471311</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>TechSupport_No</th>\n",
       "      <td>0.212638</td>\n",
       "      <td>1.236937</td>\n",
       "      <td>0.069651</td>\n",
       "      <td>0.076125</td>\n",
       "      <td>0.349152</td>\n",
       "      <td>1.079097</td>\n",
       "      <td>1.417865</td>\n",
       "      <td>3.052913</td>\n",
       "      <td>2.266315e-03</td>\n",
       "      <td>8.785436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>TechSupport_No internet service</th>\n",
       "      <td>-0.058015</td>\n",
       "      <td>0.943636</td>\n",
       "      <td>0.100965</td>\n",
       "      <td>-0.255901</td>\n",
       "      <td>0.139872</td>\n",
       "      <td>0.774218</td>\n",
       "      <td>1.150127</td>\n",
       "      <td>-0.574603</td>\n",
       "      <td>5.655596e-01</td>\n",
       "      <td>0.822249</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>TechSupport_Yes</th>\n",
       "      <td>-0.211924</td>\n",
       "      <td>0.809026</td>\n",
       "      <td>0.072953</td>\n",
       "      <td>-0.354909</td>\n",
       "      <td>-0.068940</td>\n",
       "      <td>0.701238</td>\n",
       "      <td>0.933383</td>\n",
       "      <td>-2.904958</td>\n",
       "      <td>3.673021e-03</td>\n",
       "      <td>8.088817</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>38 rows × 10 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                     coef  exp(coef)  se(coef)  \\\n",
       "covariate                                                        \n",
       "MonthlyCharges                  -0.003597   0.996409  0.040010   \n",
       "InternetService_DSL             -0.160578   0.851651  0.072205   \n",
       "InternetService_Fiber optic      0.186995   1.205622  0.071461   \n",
       "InternetService_No              -0.058015   0.943636  0.100965   \n",
       "OnlineSecurity_No                0.313812   1.368632  0.069632   \n",
       "...                                   ...        ...       ...   \n",
       "Contract_One year               -0.353184   0.702448  0.077743   \n",
       "Contract_Two year               -0.780959   0.457967  0.081116   \n",
       "TechSupport_No                   0.212638   1.236937  0.069651   \n",
       "TechSupport_No internet service -0.058015   0.943636  0.100965   \n",
       "TechSupport_Yes                 -0.211924   0.809026  0.072953   \n",
       "\n",
       "                                 coef lower 95%  coef upper 95%  \\\n",
       "covariate                                                         \n",
       "MonthlyCharges                        -0.082015        0.074820   \n",
       "InternetService_DSL                   -0.302097       -0.019060   \n",
       "InternetService_Fiber optic            0.046934        0.327057   \n",
       "InternetService_No                    -0.255901        0.139872   \n",
       "OnlineSecurity_No                      0.177335        0.450288   \n",
       "...                                         ...             ...   \n",
       "Contract_One year                     -0.505558       -0.200809   \n",
       "Contract_Two year                     -0.939943       -0.621974   \n",
       "TechSupport_No                         0.076125        0.349152   \n",
       "TechSupport_No internet service       -0.255901        0.139872   \n",
       "TechSupport_Yes                       -0.354909       -0.068940   \n",
       "\n",
       "                                 exp(coef) lower 95%  exp(coef) upper 95%  \\\n",
       "covariate                                                                   \n",
       "MonthlyCharges                              0.921258             1.077691   \n",
       "InternetService_DSL                         0.739267             0.981121   \n",
       "InternetService_Fiber optic                 1.048053             1.386880   \n",
       "InternetService_No                          0.774218             1.150127   \n",
       "OnlineSecurity_No                           1.194032             1.568764   \n",
       "...                                              ...                  ...   \n",
       "Contract_One year                           0.603169             0.818068   \n",
       "Contract_Two year                           0.390650             0.536884   \n",
       "TechSupport_No                              1.079097             1.417865   \n",
       "TechSupport_No internet service             0.774218             1.150127   \n",
       "TechSupport_Yes                             0.701238             0.933383   \n",
       "\n",
       "                                        z             p   -log2(p)  \n",
       "covariate                                                           \n",
       "MonthlyCharges                  -0.089912  9.283573e-01   0.107248  \n",
       "InternetService_DSL             -2.223935  2.615284e-02   5.256889  \n",
       "InternetService_Fiber optic      2.616742  8.877350e-03   6.815655  \n",
       "InternetService_No              -0.574603  5.655596e-01   0.822249  \n",
       "OnlineSecurity_No                4.506713  6.583963e-06  17.212612  \n",
       "...                                   ...           ...        ...  \n",
       "Contract_One year               -4.542944  5.547410e-06  17.459754  \n",
       "Contract_Two year               -9.627673  6.109722e-22  70.471311  \n",
       "TechSupport_No                   3.052913  2.266315e-03   8.785436  \n",
       "TechSupport_No internet service -0.574603  5.655596e-01   0.822249  \n",
       "TechSupport_Yes                 -2.904958  3.673021e-03   8.088817  \n",
       "\n",
       "[38 rows x 10 columns]"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cph.summary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Interpretation of the coefficients: changing a feature by 1 unit causes a multiplicative \"change in hazard\" by exp(coef). \n",
    "  - We're sweeping some details under the rug here.\n",
    "- Note that, as discussed in Lecture 9, if $\\textrm{coef}>0$ then $\\exp(\\textrm{coef})>1$.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Could we have gotten this type of information out of sklearn?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6464     No\n",
       "5707     No\n",
       "3442     No\n",
       "3932    Yes\n",
       "6124     No\n",
       "Name: Churn, dtype: object"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Coefficient</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Contract_Month-to-month</th>\n",
       "      <td>0.629461</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>TotalCharges</th>\n",
       "      <td>0.609612</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>InternetService_Fiber optic</th>\n",
       "      <td>0.566841</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>OnlineSecurity_No</th>\n",
       "      <td>0.290896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PaymentMethod_Electronic check</th>\n",
       "      <td>0.255360</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>MultipleLines_No</th>\n",
       "      <td>-0.205720</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>MonthlyCharges</th>\n",
       "      <td>-0.278976</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>InternetService_DSL</th>\n",
       "      <td>-0.434388</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Contract_Two year</th>\n",
       "      <td>-0.622706</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tenure</th>\n",
       "      <td>-1.393448</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>46 rows × 1 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                Coefficient\n",
       "Contract_Month-to-month            0.629461\n",
       "TotalCharges                       0.609612\n",
       "InternetService_Fiber optic        0.566841\n",
       "OnlineSecurity_No                  0.290896\n",
       "PaymentMethod_Electronic check     0.255360\n",
       "...                                     ...\n",
       "MultipleLines_No                  -0.205720\n",
       "MonthlyCharges                    -0.278976\n",
       "InternetService_DSL               -0.434388\n",
       "Contract_Two year                 -0.622706\n",
       "tenure                            -1.393448\n",
       "\n",
       "[46 rows x 1 columns]"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr.fit(X_train, y_train)\n",
    "lr_coefs = pd.DataFrame(data=np.squeeze(lr[1].coef_), index=X_train_enc.columns, columns=[\"Coefficient\"])\n",
    "lr_coefs.sort_values(by=\"Coefficient\", ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- There is some agreement, which is good.\n",
    "- The coefficient for `tenure` - ha! Well that is definitely cheating!!! \n",
    "- But our survival model is much more useful.\n",
    "  - Not to mention more correct.\n",
    "- One thing we get with `lifelines` is confidence intervals on the coefficients:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [],
   "source": [
    "# plt.figure(figsize=(8,8))\n",
    "# cph.plot();"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- (We could probably get the same for logistic regression if using `statsmodels` instead of sklearn.)\n",
    "- However, in general, I would be careful with all of this.\n",
    "- Ideally we would have more statistical training when using `lifelines` - there is a lot that can go wrong.\n",
    "  - It comes with various diagnostics as well.\n",
    "- But I think it's very useful to know about survival analysis and the availability of software to deal with it.\n",
    "- Oh, and there are lots of other nice plots."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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vnTpktZa6+joaA3o6Oho0zY5Z93K2ubf//632bGeeOIJ7ezsbJpxatu2bRrQy5YtM9tuxYoVGtAHDx7Ms72ibJCZswrv/97aov/vrS3FdjzymTnLmpx+U+CIhfKjQKGTukqpewAvIK6w+1YkgwcPNlv+17/+xfXr1zlyxPir+PTTT+nQoQPVq1encuXKVKlShevXr3PixAnTPu3atWPu3Lm8+eab/PTTT1kfuCbffvst/v7+/OMf/yAtLc30euCBB0hNTSU2NrbQ7e7du7fZcvPmzbl58yaXLl0y1enk5MTAgQNz1Qmwbdu2QtcpRFm3feEzbF/4TKnUZU16xwNItFCeANQoTGVKqcrAu0A88H4+2z0OPA7g51e0R49mH17o6Ohotuzm5ma2XK1aNbPlWrVqmS17e3ubLderV89suUGDBmbLxfG439q1a1tcPnfuHOvWrWPIkCGMGDGCadOmUatWLRwcHOjVq5dZXnzVqlVMnz6d119/nUmTJuHj48PYsWOZMmUKDg4OXL58mTNnzuDo6GixDX/99Veh2+3h4WG27OzsDGBq1+XLl7l16xbu7u7FVqcQZV1Dw4BSq8vaIZuWJtItynRF/wX+AfTWWlv6IDFWpvV7wHtgnCO3CPWUeZcuXaJBgwZmywC+vr6888473H333Xz44Yem9ampqSQkJJgdw8vLi7fffpu3336bEydOsGzZMqZNm4anpyfjxo2jZs2a1K9fn08//dRiGwICAor956pZsyYuLi5s377d4vo6deoUe51C2Du/tt1KrS5rgn4ixt5+TjWw/A3AIqXULIy99xFa643W7ldRffrpp0yefPtizyeffIK7uzvNmjUjOTmZypXNf3XLly8nPT09z+MFBQXx2muv8e6775pSRD179uSLL77A3d2dxo0bl8wPkkPPnj2ZM2cOV69eJTTUdnclCmFPbqVcL7W6rAn6RzHm9XNqAhyzphKl1EsYh2s+pbVebn3zKq7FixeTkZFBu3bt+O6771iyZAkRERFUr16dnj17snr1ap5++mn69OnD/v37eeutt6hevbpp/6tXr9KtWzeGDRtG48aNcXR0ZM2aNSQmJpry58OGDWPp0qWEhobyzDPP0LJlS27dusXJkydZu3Ytq1evxs3NrVh/ruDgYB566CEGDRpEeHg47du3x8HBgdOnT7NhwwbmzJlDYGBg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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cph.plot_partial_effects_on_outcome('Contract_Two year', [0, 1]);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAAD9CAYAAABQvqc9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABgXElEQVR4nO2de1yVRfrAv5NwuAgkiAK6gngJFEm20MRSNDHNC2llJuCtLSl3rVwzTCVMVrHNtp9a5m3VFV0vqRmUtyi1vBaWrUlS4l0QL6BGINf5/XE4Rw7nAAflznw/n/fDeeedd2be4ZxnnveZmecRUkoUCoVC0Ti4r7YboFAoFIqaQwl9hUKhaEQooa9QKBSNCCX0FQqFohGhhL5CoVA0IixquwEV4ezsLNu2bVvbzVAoFIp6w9GjR69JKVuYulbnhX7btm1JTEys7WYoFApFvUEIca6sa8q8o1AoFI0IJfQVCoWiEaGEvkKhUDQizBL6Qog/CSEWCSEOCSGyhRBSCNHWzHuthRDvCSHShBA5xWX0vqdWKxQKheKuMFfT7wA8B2QC31ayjn8DLwFvA0OANGCXEMKvkuUoFAqF4h4xd/XON1JKFwAhxIvAE+bcJIToCoQAL0gpVxWn7QNOALOB4Eq3WKFQKBR3jVmavpSy6C7LDwbygY0lyioANgADhBBWd1muQqFQKO6C6l6n7wOckVJml0o/AWjQmo1OVEfFm0K68Y8dSfRzu5/+rZpRUCT5Nj2Xvz30WHVUp1AoFFWKVSdvXKdPr/Jyq1voO6GdByhNRonrRgghJgATANzd3aukIf89f43jGX8QlHGySsqrazS3aU4LG5Mb8BQKhUJPdQt9AZiK0iLKu0lKuQxYBuDv739XUV6e++/3PFfifH1YO+w0tmx4zuduiqvTJKYnAhfxd3Gt7abUGwa1G8SIB0bUdjMUihqnuoV+BmBKVXcscb1GmNa5FQA+A1fVVJU1xie/fsL209truxn1hsT0RBLTExtNn6kBTlGS6hb6J4DhQgjbUnb9zkAecKqa69eTk1dYU1XVOCMeGKF+1JWgMQ2SdWmAU4NP3UBUNkZu8ZLN5YCnlPJsBXn9gB+BcVLK/xSnWQDHgVNSyqEV1efv7y+rwuFat3b3A/D96Zv3XJZCUV+oKwOc1gQJ/i7+1VqPGli0CCGOSilNdrbZmr4Q4tnijw8X/31SCHEVuCql3CeE8ABSgNlSytkAUspjQoiNwP8JISyBM8ArgCcQenePc3eM7K7s3YrGR115C6yJwac632oa0mBitqYvhCgr4z4pZZ9itwxngHeklLNK3GcDzEG7SasZ8BMQIaXca069VaXpn5j7GG3zT9PU/c93En2fBf/x91y2QqGofaprYLmbt5TaHiTK0/Qrbd6paapK6C+YO5VHbn9LD8/m2oTLx8HVF8Z/cc9lKxSKhktlBxNTg0RNDwJK6AMtH3gIgCu//qBNWDVY+1cJfYVCUYWUHiTKelOozoFACX3g0ZdjuJCZzUPde3Jw6QyiHrnNs93ccHn1qypopUKhUJjG1JtCdb8NVMlEbn3nr+ND+ezYJXKzbgCQW1CEXeYvdzR+UDZ+hUJR5ZiaTDf1NlB6Erq63gQajaZfmvfemUz32wcIfKDYdYGy8SsUilrC1CDg7+LPqrvcTKo0fRO8t24fAFd+LRbyqwZrBX9JzR+U9q9QKKqd0m8D7373brXV1WiFvvfA0ZzPyGbk0kMA9Mt+iKea3salZKbLx7V/ldBXKBQ1SET3iGoru9EK/ZdDn2H91z+w5/2/0nnQOBY1e4yv3AaxcXzAnUyltX6FQqGo5zRaoR/yiDu9WglG73Jg5pDOfHD4BllXfzfOWNrko8w9CoWiHtNohT5AmzZt2Lt3LwAhE7Xr+Jn57J0Mvs8a3qDMPQqFop7TqIV+SXyGvsi563/obfxavHnK72NCHin2Dm1qsldp/gqFoh5hVozcxsBLzw3By7MNe97/K9dStBr9Dz/9j38t+uhOJt9ntcs6dZzbD5+/rh0EdEdiw/PXr1AoGg5K0y8m5BF3Hm6WQ/geB6KHdaFnzwA8HpnF+cyrQPHyKf/xhlp94io4vvnO+bn92qNkGqi3AYVCUWdotJuzzKH/W//m9LU/8Pfvpk97yq/1HXNPaUoPAqA2fSkUihpHbc66S8YP68/q+D3sef+v+D33GmkWWp/8ZQr90m8CoOYBFApFnULZ9Msh5BF3/vlsVzq3cuCfz3bFNfciGWeTKldI6XmAy8eN3wYUCoWihlDmnUrQ8oGH+COvgCFvLdWnlWvuMYVO8y85ECjNX6FQVCHKvFNFTJn1LntOpnMt5TjHty2h2RMTgXLMPaYovfbf1OSvGgQUCkU1oTT9u+DgwYNMnz4dm74vk3zmAlkH19NtzHTsWrSuvOZvagUQgMdjhvnUQKBQKMxEafpVTM+ePdm7dy//PXKe5Zs+50Rx+ncH9pL+S1NCHnnV/MIqWgYKaiewQqGoMpSmX4WYsvnDXdj9S6PmARQKRSVQmn4NETl/MbtPXCbtxGFO7oylx4uzOZNtCVTS7l8aNQ+gUCiqCCX0q5BJwT2YFAw7d+5k3v8cWDbGnxHRsRxOzmZkiXyV1vwrMgEp849CoTATZd6pZjo/FEBhc0/8np3ExR/3cmznejo99iSJa6swMo4y/ygUihIo804t8vrL43n66adxdnZm69Y0Zpz1I/tPjxh487xnm78y/ygUCjNRmn4N898j51m04j+k7PuUXpPe59freXR2c2BjeEDFN5uLKfOP8v+jUDQalKZfhwh5xJ0mZx/g498ciP3LIzz+t3c5+L+ce7P5l6b0HIAK+q5QKIpRQr8WGDlyJCNHasX8rWO7uf9PWlv8mYNfcGJfHLy19N6EfmlKm39AmYAUikaKEvq1zOsvj2f8+PFYWlqy2iqZNw9ZkJR2q1QEr3vU/k15/zQnFoAaBBSKBoey6dcx/nvkPP9atJgLR7+iz+sLAfg2bh2tHJtW7Yqf0pjjDkINAgpFvaA8m74S+nWQ5cuXs3HjRhISEgBwcPVA2rdk0BsL9Xnu2e5fEconkEJRb1FCv57z3yPn+ezYJX79aiNXko9i+eQ0AB7xdNLnqfFBANTbgEJRR1Grd+o5IY+4E/KIOwtuf8dXt0/z/HBfPjt2SX89Ke2WPl+1oeYFFIoGgdL06yHz589nxYoVnDx5EoAHh7/C9QINjw15Xp+n2jV/U6h5AYWiTqA0/QaGg4MDPj4++vNrP36JRYu2AJz4YhUXz56Cv86peaGvfAQpFHUeszR9IUQb4AOgPyCABOB1KeV5M+51B6KBvoAzcBHYBMRIKf+o6H6l6VeO6OhoVny+H4cn/05nNwd9eq1o/qVRPoIUihrhnjR9IYQt8DWQC4wFJPAPYI8Q4sHyBLcQoinaAcISiATOA92Ad4COYLARVVEFREZG0v6J8zVv8zcHc3wE6fKpgUChqBbMMe+8BLQDvKSUpwCEEP8DfgPCgX+Vc++jaIX7ACnl7uK0PUIIJ+ANIYStlDL7rluvMMnJL1bw06ZNept/p4Fj2G/paDTC1rj2b06UMDUZrFBUK+YI/WDgsE7gA0gpzwghDgBPUb7Q1xT/vVUq/QZwH1pTkaKK+dOf/kRAwB0HbjdPHsSmjY9Bnjqh/asVQQpFjVOhTV8IcRn4TEoZXip9MTBCStminHutgf8BacAraM073YF1wKdSyokVNVDZ9KuON954g5ycHD766CNGLj1EUtqtumf3L41aEaRQVJp7Xb3jBGSaSM8AHMu7UUp5WwjxGLAF9PHDAVYAfyvrPiHEBGACgLt7HRNCDYRbe1Zwbm8Cnd/ZAMD2pXNIaOnJZ8ND9HnqxCBQkUlIzQsoFJXC3CWbpl4HKjTNFGv6G4GWwGjuaPpvAwVotX/jyqRcBiwDraZvZhsVFTB//nz95+GPP4KXqz3/V+zHv1XMSeyb39H664T5xxRqXkChuCfMMe+kA9vu0rzzV+BDoIOUMqVE+ktohbqflPKn8upX5p2aZcKECTRv3pzTbYPrh/nHFMokpGjk3Kt55wTgYyK9M5BUwb2+QGZJgV/Md8V/OwHlCn1F7fCUX2u++88/+NnRhS7BL3HkTAZHzmQYLAXV5atzA4HaJKZQlIk5Qj8OmC+EaCelPA0ghGiLdjnmtAruvQw4CiE6lFz9AzxS/PeSiXsUtciyZcv0n7/0akmbNn9idngAjw0czv+O/QDFcwCHVkTye9M/ceTMCIOBoF4MAqYiiSnNX9FIMEfoL0c76fqZEGImWvt+NHABWKrLJITwAFKA2VLK2cXJq4G/A9uFEHPQ2vT90W7UOgocqJrHUFQHq1at0n8e8/STpD/6EJHFcwDP73GG5q7IEp4+6+w8QGnUJjFFI8ZcNwzuGLph+AqtG4azJfK0Bc4A70gpZ5VI7wzMAgLQumG4gPbtYY6U0tSqIAOUTb9u88wzzxAQEMAbb7xhchloaerkm4ByG61oYNyzw7ViHzvPVJDnLCZW9Egpk4DnzKlHUb85tfZtzv32q34Z6DeL/k5rv9607zUMqMNvAuZsElPzAIoGgvKyqbgntmzZov8cPnoEOTk5vFZsAvL+IJMXenowMTyAoKAgrFz9we2p2mpq5VDzAIoGihL6iipjwoQJBuc63z8lKR30vU6ae0xhzjyAGgQU9QAVREVRY+jCPurQ2f83hgeUc1cdRe0FUNRhVBAVRZ1gWcQYLl++zMmTJ8nPz6e1zyNkePWqfe+fd4PaC6Copyihr6gxQkJC0Gg0+nOrwj9o3aIZBXm3+XbRFNoHDiet+UNGm8Dq5SBgag4AlPavqHWU0FfUGCVt/paWllxISQYgOzubQVsceCXoAX539uCL42n6fKZ2AteLQaD0HACoeQBFnUDZ9BV1ij59+pCdnc13333HtWvX6P3EUGw731n2eeRMBgCPlNgUVi8GATBtAnL1hfFf1F6bFA0SZdNX1BtCQkJwdnbWnzva3Me0kY/RrZsnzz//PCOHvcBZm47663V27b8p1DJQRR1ACX1FnaKkCcjZ2ZkDB7SeOi5fvgxAX++W+Pj8idGjRzNz5kyW42C0DBTqifZf2gSkJn8VNYAS+op6gaurK3v37gXgwoUL+vSAFoVkXf0duOP6od7MAyjNX1ELKJu+ol7Tp08fbGxs2LFjB8nJyYSHh9Mn9FV+KXLT56k38wDmrP0HNRAoKkTZ9BUNlpCQELy8vAzSnvBx5VkHe/72t7/x3nvv8Zufr9GmMKiD8wDmRAVTJiDFPaKEvqJeU3IOwMvLS28C+vnnn/Xpna0yiNuzgGnTpuHn50f/t/5Nyre/Ql3fCWzKEVzpdf8KRSVRQl/RIOnSpYt+AFi2bJl+Ihjgl11rycy4zsilw/RpddLcUxamNn2VRJl/FOWgbPqKRse7//2SPSfTub91e8C0zR/q6EBgyuRTEuUDSEH5Nn0l9BWNkoMHDzJ9+nSWLl3K0Rs2RrF/683kb2nUBjAFaiJXoSiX1rfPcGvbPD766CPatWtHQkICx5f+A9vOvcFzGFCHJ39Lo5aBKipACX1Fo6Rnz556m/++ffvIyckxuN434CGmTfsbJ06cYN68eXgOeqN+xgJQG8AUpVDmHYWiHHbu3Mm8efN47s357LuQr0+vt7EAdJq/q69hutL+GxTKvKNQ3CUDBw5k4MCBxMfHc3HNPD777DOcnZ159OUY9h+9bBALoF5q/qC0/0aGEvoKhRmkpaVhaWmpP7/87Uby8++DIc8D9djmD8ru38hQ5h2F4i64efMmoDX/fPzxxzR/Jopfr+fR2e2OD6B6ofmDWvHTAFHmHYWiirn//vsNzoc82IqdJzP056acvkEdHQhMrfhRNFjuq+0GKBT1mZEjR7J3714sL3zPiUUvsfYFfzaGBzDA8iTOF78xyJuUdstoEKiz6Mw9uiNxVW23SFFFKE1foagCsrOzDYK/7PtkOa6urmwMf1efNnLpofqx7LP0ZK8K89igaBA2/Vu3bnHlyhXy8/PLzadQ1DS///472dnZuLi48EduAdl5hfpr+YVFWDa5jxb2VrXYQjPIzYL87DvnhXnQRAN2LWusCZaWlrRs2RIHB4eKMysatk3/1q1bpKen07p1a2xsbBBC1HaTFAo9V69eJSMjAy8vL65cuQJAy5ZaYZlyNYvb+YVoLJvo8zezsaS5XR0fBK79Bvk5YFlKfNg4QlNn0/fcA1JKcnJyuHRJaxpTgv/eqPdC/8qVK7Ru3RpbW9vabopCYUSLFi1o0aIFADdu3AC0Qj89PZ3czJtYN2+lz3s7v5AbUPeFvo2jcVpelvbIyTTMVwWDgBACW1tbWrduTWpqqhL690i9F/r5+fnY2NjUdjMUigp54IEHDM4tmwjat7DTn6dczarpJt0dTZ2Nhfkf1wwFfn7OnbxVhI2NjTLhVgH1XugDyqSjqHe4uLjg4uLC5cuXycrKokOHDoBW2y8p/OuFuQeMB4Jrv1V5Fep3XjU0CKGvUDQIsm9AfiHc3xyAP3IL+CO3gBs5htptvRkIFHUSJfQVilrE1dX1zklBLtYC2rewIzU1lfzsbCwdXQ3y1xu7P2hNPCU1/mqa6FVUDrU5q46xevVqhBAIIfj111+Nru/du1d/PSEhodrasHLlyjLbdurUqXLvP3v2LEIIVq9efVf1X7t2jbfeeosuXbrQtGlTbG1t8fX1Zdq0aaSlpenzCSGYOXPmXdVRF2nfvj3t27fXn2ss7qN9CzuDw7rESp/SXLx4kUmTJhEQEICtrS1CCM6ePWsyb2ZmJi+++CLOzs40bdqUoKAgjh8/XnUPY+MIliXm2vJzDG3+ilrDLKEvhGgjhNgshLgphLglhNgqhDB7R4kQopMQ4hMhxDUhRI4QIlkI8drdN7vhY29vT2xsrFH6mjVrsLe3r9a6yxL6NUFSUhJ+fn6sWbOG0aNHExcXR3x8PGPHjmXLli1MnDixVtpV07Rq1Yp27dpx6dIlzpw5o0/PybxK1o0MUq5m6Y/rWbkAnDp1ik2bNuHo6EivXr3KLFtKSXBwMDt37mTRokVs2bKF/Px8+vbty8WLF6vmAZo6g3PHO4elWmxRV6jQvCOEsAW+BnKBsYAE/gHsEUI8KKX8o4L7/Yvv3wu8CNwEOgJ25dzW6Hn66adZu3Yts2fP1k9g5eTksGXLFp555pm71qLrMgUFBTzzzDNYW1tz8OBB/Xp2gH79+vH666+zY8eOGmuPlJL8/Hw0Gk2N1VkRhbezuE9zR4CWtPu37vQQB39OoZmNJZ9uiGX37t0my4iLi2P//v18/fXX9O3bF4CAgAA8PT355z//ycKFC6un8crcUycwR9N/CWgHDJNSbpNSfgYEAx5AeHk3CiHuA/4DfCWlDC6+f4+UcpmU8l/32viGzOjRozl37hz79+/Xp3366acUFhbyzDPPGOVfu3YtXbt2xdraGmdnZ0aPHm1gCgFo27YtYWFhbNiwgU6dOtG0aVP8/f0N6ujTpw/79u3jwIEDejNSnz59DMq5du0aoaGhODg40KpVK1599VVu375d5rPMnz8fKysrrl69apAupaRdu3aMGjUKgK1bt3Ly5EnmzZtnIPB1WFhYMHToUKP0hQsX4unpib29PYGBgZw4ccLg+u7duxk0aBBubm7Y2trSpUsX3n//fQoLCw3y6fpn5cqVeHt7o9Fo+OILrafJhIQE/vznP2NtbU2HDh1YsWIF48aNo23btgZlZGdnExERgaenJxqNBk9PT+bMmUNRUZE+T1ZWFpMmTcLd3R0rKytcXFwICgri5MmTRs/WunVrPD099eddH/TF17uD3tzTupkNTa20utt9993HH7kFXLqRw5Xftf+Pc9f/0L8J6IiLi6NVq1Z6gQ9aB3JDhw7ls88+M2pDlaDMPXUGcyZyg4HDUkq9IVdKeUYIcQB4CihPePcBOgMv30sjGyMeHh707t2b2NhY/av6mjVrGD58OHZ2hi9Jy5YtIzw8nJEjRxITE0NqairTp0/nyJEj/PDDDwb5v/32W5KTk4mOjsba2prIyEiGDBnC2bNnadasGYsXLyYsLIzCwkKWLl0KGO+AHD16NKNGjWLr1q0cOnSIWbNm4ejoyDvvvGPyWV544QUiIyNZtWoVb775pj599+7dnDlzRm9KSkhIoEmTJgwaNMjsflq7di1eXl4sWLCAvLw8pk6dylNPPcXJkyexsNB+vU+fPk2/fv2YNGkS1tbWJCYmMmvWLK5evcq8efMMytuzZw/Hjh0jKiqKli1b0rZtW5KSkhg8eDDdu3dnw4YN5OXlER0dzc2bN7nvvjt6U0FBAQMGDCApKYnIyEh8fX05fPgw0dHRZGRk8P777wMwefJk4uLimDt3Lh07duT69escOHBAv3kLoLCwkLJcpFy4cIGioiI8PDxwaqrhj4x0ANzd3bmelWuw2ie3oJAbOfkGE78nTpygS5cuRuX6+PiwZs0asrKyjL5j94ypJZ2lNX9Q2n8NYI7Q9wFMDf8ngBEV3PtY8V9rIcRh4GEgE9gAREgpc8q88x54J/4ESam3qqNos+ncyoGooT73VMaYMWOYMmUKCxcuJDMzk4SEBCPzRmFhIZGRkfTp04cNGzbo0729venVqxcrV67k1Vdf1affunWLY8eO4eio3VXp6upKt27d2L59OyEhIXTu3BkHBwcKCgro0aOHyXaFhIToBXxQUBBHjhxh/fr1ZQp9JycnRo4cybJly5g6dareXLV06VK8vLz0bxIXLlygRYsWldpdbWlpyeeff24Q4GTEiBF899139OzZE4CXX76jc0gp6dWrF3l5ecyfP5+5c+caCO7MzEyOHj1qsKomJCQEBwcHdu3apW9br1698PT0NMi3fv169u/fz759++jduzegNUsBvPPOO0RERNCyZUsOHTpEaGgof/nLX/T3Dh8+3OC5+vXrx759+yp8/j179tCuXTv9edb1y+T8/jst7a0BKMrKIOtGM1JK3HP12nWjNxTQ/p90fVDlQr80pnb1VsOGLoUx5ph3nNAK6tJkACb+cwbo9phvBHYD/YF/orXt/7esm4QQE4QQiUKIxNImgcbEiBEjyM3NJT4+nnXr1uHq6qoXIjqSk5O5cuUKoaGhBumPPfYYHh4eRoIjICBAL/ABfH21sVLPnz9vdrsGDzb0t+7r61vh/RMnTiQlJYWvvvoK0Eaiio+PJzy8XAthhfTv399A4Jt6nrS0NMLDw/Hw8ECj0WBpacnMmTO5ceOG3h+Ojh49ehguowQOHz7MoEGDDAYjNzc3/aCiY+fOnXh4eNCzZ08KCgr0xxNPPEF+fj6HDx8GoFu3bqxevZq5c+eSmJhoZGYC7YD4/fffV3g8/PDDuLu74+6uXVdha2tr4Ou/KO82TeSd8m/nF1JYJE1udKpR54ulJ3rVZG+NYe46fVPfBnO2x+kGlbVSyreLP+8VQjQB5gkhOkspk4wqk3IZsAy0XjbNbKOee9Ww6wr29vYMGzaM2NhYzp49S2hoqIFWCpCRoQ3c4ebmZnS/q6ur/roOnTanw8pK+9pfnk2+NKbKyM3NLSO3lu7du+Pv78+SJUsICgpixYoVWFhYMHbsWH2eNm3a8OWXX5KdnW22tl/R8xQVFREcHExqaiqzZs3C29sbGxsbtm3bxpw5c4ye21Q/pqWlmZxjcHFx4fTp0/rzK1eucO7cOYNBqCTXr18HYNGiRbi6urJy5UpmzJiBk5MTY8aMYc6cOfrn7tChg1lCuEkTwyWcOj8/Ojp38qZt27acOXNGOyGtuZ9mjo5G3wvQaviAgVKgaHiYI/Qz0Wr7pXHE9BtASa4X//2yVPpuYB7gBxgJfcUdxowZw+DBgykqKmL9+vVG13VC7/Lly0bXLl++jL+/Se+qtcIrr7xCeHg4ly5dYsWKFYwYMcJAaAcFBbF8+XJ27NhhcrL6bkhJSSExMZHY2FjCwsL06fHx8Sbzm9KA3dzcjN4IANLT0w3OmzdvjqenJ5s2bTJZts6kYmdnR0xMDDExMZw7d47Nmzczbdo0NBoN776r9b9fGfNO6Yn2ivDs6MWhb/YYuXtISkrC3d29+k075aFW+FQ75gj9E2jt+qXpTMUCW7eMorTKovtlFaEol/79+/Pcc8/RrFkzfHyM/w1eXl64uLiwYcMGAxvxwYMHOXfuHFOmTKl0nVZWVvz+++/31G5TjBo1ijfeeIOQkBDOnz9vYGsH7TJVLy8vIiIi6N27t5HWWlBQwK5du4zMS+WRna31A19S+87Pz2fdunVml9GjRw+2b99u8AaSlpbGgQMHDN4MBg4cyJYtW7Czs8Pb29ussj08PJgyZQrr1q3j559/1qcvXbrUrP+Bl5eXWfXoVgCd/PUUgY/2ZNvGdRw5uJ9Hej7G7fxCLvx+i/j4eEJCQswqr1oobedXNv5qwRyhHwfMF0K0k1KeBhBCtAUeBaZVcO8OtOv7BwKfl0gfUPxXRTyvgCZNmpjU8Etenz17NuHh4YSFhREWFsalS5eYMWMGHTt2ZPz4ykc36ty5M4sXL2bjxo20b98ee3t7s4VLedjY2DBu3Dg++OADfH19jWziFhYWbN26lf79++Pn58drr72mf1P56aefWLZsGd7e3pUS+p06dcLDw4MZM2bQpEkTLC0t+eCDDyrV7pkzZ7J582YGDBjAG2+8QW5uLtHR0bi4uBiY20JDQ1m1ahX9+vVjypQpdO3alby8PFJSUoiLi2Pbtm3Y2toSEBBAcHAwvr6+2NnZsW/fPn766ScDU9fd9vfmzdroVkePHgVgx44devfOgYGBONjZ8uzwYDatX0vE317ivffeI0dYs3jBfAqLJM/95a+kXM2qHf8+5qzwya0nnkjrMlLKcg+gKXAKOI52iWYw8BNwGrArkc8DKADeLnV/VHH6XCAI7UCRA6yuqG4pJQ8//LAsj6SkpHKv1zdWrVolAfnbb7+VmWfPnj0SkF9++aU+LTY2Vj744INSo9FIJycnGRYWJlNTUw3u8/DwkKGhoUblATIqKkp/npaWJp988klpZ2cnARkYGFhu26KioqT2q6TlzJkzEpCrVq0yquvgwYMSkB9++GGZz3f16lUZEREhO3XqJG1sbKS1tbX09fWV06dPl+np6QbtnjFjhsG9pur+8ccf5aOPPiptbGxk69atZWRkpFy+fLkE5JkzZyrsHyml3L17t+zatavUaDTS09NTLlmyRA4bNkz6+fkZ5MvJyZFRUVHSy8tLajQa6ejoKP39/WVUVJTMz8+XUkr55ptvSj8/P+ng4CBtbW1lly5d5IIFC8rsj8qA9q3a6ND9D3UkJibKkSNHSkdHR2ljYyMDegXK+K8PylNXfpc/X7ohT135vUrac09kXZXy6q93jtSfZNJ3e2u7VfUCIFGWJdPLumCQCdyBLcAt4HdgG9C2VJ62xV+wWaXSBfD34oEjDzgHzAYszam7sQn9hs706dNl06ZN5c2bN2u7KffE77//Ll1cXOQLL7xQ2025K06dOqVXCn777TeDgfzUld/rhtAvzdVfldA3k/KEvlmrd6SU54FyZ9aklGcxsaKnuAH/ovxNXIoGzo8//khycjILFixgwoQJ9S760aRJk+jZsyetWrUiNTWVBQsWkJmZyWuv1U8XUiUdu5WcuP3tt9/Iv88KaXN/3fTrX5gHq0qY91SA9kqjXCsraoThw4eTnp7OgAEDytzEVZe5ffs2ERERpKeno9Fo6N69OwkJCTz44IO13bR7pvS+BBuNBUUlvHnWGXfONo7QJPXO+eVir6BK6FcKJfQVNUJZLn7rC8uXL6/tJtQIHTt2NErTBXCvdc2/qTPYtYTxWn9IrBqsFfxK868Uyp++QqEw4NdffzVYPnr76kXE7TvLR2/nFxpF86oVfJ8FV98755ePw/HNtdeeeoLS9BUKhQGOjo4Gu4FlUQEt7a1o0cKO5ORk7tPYcRs7o0DuNa79+4831OpNaf6gtP9SKKGvUCgMKL0prrRHTltNEwpKRfCqE3Z/32eN05Td3wgl9BUKhdl4eXnpYwOU3JhWJ+z+pTV/MNb6FUroKxSKyvHbb79RUFCAj48PhYWFnDp1Cht7R7C84ySvTmj+OtRkrwFK6CsUikrh5ORk5O3VztoCBwdrUlJSaNmyJRmY9jRa45Q2+ShzjxL6CoWicpS0+Tdp0kTvJ6igoECfLk3ECKgVzJnsbWSav1qyWcdYvXq1Pjbtr7/+anR97969+usJCQnV1gZdCENTbTt16pSJu+5w9uxZhBB3Hbz92rVrvPXWW3Tp0oWmTZtia2uLr68v06ZNM4j7K4Rg5syZd1VHQ+TixYtMmjSJgIAAbG1tEUKUuT8iMzOTF198EWdnZ5o2bUpQUBDHjx83ynf79m2mTp2Km5sbNjY2BAQE8M0335gs08LCAi8vLxwdHcm6eolbVy6ScjVLf5SO1VsrlF7meW4/fP66dhDQHYmraq15NYES+nUUe3t7YmNjjdLXrFmDvb19tdZdltCvCZKSkvDz82PNmjWMHj2auLg44uPjGTt2LFu2bGHixIm10q76wKlTp9i0aROOjo76uMqmkFISHBzMzp07WbRoEVu2bCE/P5++ffty8eJFg7x/+ctfWL58ObNnz+bzzz/Hzc2NAQMGcOzYsXLb0rxFS2zvb64/rzNr+/3Hazd36Y4h/wcej9253hjW+pfllKeuHI3N4ZrOk+XYsWNl27ZtZVFRkf5adna2dHBwkOPGjTPyslmVBAYGykcffbTMtpXnAVTK8r1slkd+fr709vaW7du3N/CmWfJ6XFyc/hwTXjarkqKiIpmbm1tt5Vc1hYWF+s+mvIjq2LZtmwTk119/rU+7ceOGdHR0lJMmTdKnHTt2TAJy5cqV+rT8/Hz5wAMPyKFDh1aqbVXlxK3af+8rB2mPeg7lOFxTmn4dZfTo0Zw7d479+/fr0z799FMKCwtNRpVau3YtXbt2xdraGmdnZ0aPHm1gCgFt5KawsDA2bNhAp06daNq0Kf7+/gZ19OnTh3379nHgwAG9Gal0ZKZr164RGhqKg4MDrVq14tVXXy033OL8+fOxsrKidLxjKSXt2rVj1KhRAGzdupWTJ08yb948k+EJLSwsGDp0qFH6woUL8fT0xN7ensDAQE6cOGFwfffu3QwaNAg3NzdsbW3p0qUL77//vlFsWl3/rFy5Em9vbzQaDV98od3yn5CQwJ///Gesra3p0KEDK1asYNy4cUYBxrOzs4mIiMDT0xONRoOnpydz5szRL3MEyMrKYtKkSbi7u2NlZYWLiwtBQUGcPHmyzD40h9KTq2URFxdHq1at6Nu3rz7t/vvvZ+jQoXz22WcG+SwtLRk5cqQ+zcLCgueff55du3aVGyIzPz+f8+fPc/PmTQCKCvLJupFR98w9ptDZ/BuoyUdN5NZRPDw86N27N7GxsfpX9TVr1jB8+HCjcHbLli0jPDyckSNHEhMTQ2pqKtOnT+fIkSP88MMPBvm//fZbkpOTiY6OxtramsjISIYMGcLZs2dp1qwZixcvJiwsjMLCQpYuXQpg5BFz9OjRjBo1iq1bt3Lo0CFmzZqFo6NjmY7UXnjhBSIjI1m1ahVvvvmmPn337t2cOXNGb0pKSEigSZMmDBo0yOx+Wrt2LV5eXixYsIC8vDymTp3KU089xcmTJ7Gw0H69T58+Tb9+/Zg0aRLW1tYkJiYya9Ysrl69yrx58wzK27NnD8eOHSMqKoqWLVvStm1bkpKSGDx4MN27d2fDhg3k5eURHR3NzZs3DQRtQUEBAwYMICkpicjISHx9fTl8+DDR0dFkZGTw/vvvAzB58mTi4uKYO3cuHTt25Pr16xw4cIAbN27oyyosLDQ7Rq6pEI/lceLECaMNVwA+Pj6sWbOGrKws7OzsOHHiBJ6enkbxin18fMjLy+PUqVMmo7kB3Lhxg5ycHH2Qdpl9A3k7B13k1Tq1pLMkjWCDV8MU+jum3flH1RauvvDkvIrzlcOYMWOYMmUKCxcuJDMzk4SEBHbs2GGQp7CwkMjISPr06cOGDRv06d7e3vTq1YuVK1fy6quv6tNv3brFsWPH9MGvXV1d6datG9u3byckJITOnTvj4OBAQUEBPXr0MNmukJAQvYAPCgriyJEjrF+/vkyh7+TkxMiRI1m2bBlTp07VC6mlS5fi5eWlf5O4cOECLVq0MDsoOmjDIH7++ecG4RBHjBjBd999p4/MVTIso5SSXr16kZeXx/z585k7d66B4M7MzOTo0aMGnidDQkJwcHBg165d+rb16tULT09Pg3zr169n//797Nu3j969ewPaWLcA77zzDhEREbRs2ZJDhw4RGhpqEN5y+PDhBs9VnTFyMzIyjN5Q4E685czMTOzs7MjIyDAZJF2Xz1RwdR26aF06XFto7fsODloFpLQLhzpDI9jgpcw7dZgRI0aQm5tLfHw869atw9XVVS9EdCQnJ3PlyhVCQ0MN0h977DE8PDyMBEdAQIDBD9nXV7uS4fz582a3q3S4Ql9f3wrvnzhxIikpKXz11VeANsZsfHw84eHhZtdriv79+xsIfFPPk5aWRnh4OB4eHmg0GiwtLZk5cyY3btwwCnjeo0cPI1fDhw8fZtCgQQaDkZubm1G4x507d+Lh4UHPnj0pKCjQH0888QT5+fkcPnwYgG7durF69Wrmzp1LYmKikZkJtAPi999/X+Hx8MMPV7rPpJQm3w5Kv1mYm88cHBwcsLKyIjk5WR/7V7eDt16YfBoQDVPTv0cNu65gb2/PsGHDiI2N5ezZs4SGhhrZbXXaVskA3TpcXV2NtDGdlqbDykr7el2eTb40psooz74L0L17d/z9/VmyZAlBQUGsWLECCwsLg7iwbdq04csvvzQIQH43bYE7z1NUVERwcDCpqanMmjULb29vbGxs2LZtG3PmzDF6blP9mJaWZnKOwcXFhdOnT+vPr1y5wrlz5wwGoZJcv34dgEWLFuHq6srKlSuZMWMGTk5OjBkzhjlz5uifu0OHDmabdyqLk5OTSS09MzMTQK8UODk5mRzMdflK931laNqkiML8QqAO+u03RQNa2680/TrOmDFj+OKLLzh+/Dhjxowxuq774V2+fNno2uXLl2nevLlRem3xyiuv8Nlnn3Hp0iVWrFjBiBEjDARHUFAQhYWFRiaseyElJYXExETeffddXnrpJXr16oW/v3+ZwtKUZuvm5mb0RgCQnp5ucN68eXM8PT3L1Mp1k9B2dnbExMRw6tQpzp49y/Tp0/nwww8NzGP9+vXD0tKywsMcE1BpfHx8jCa7Qbtc1t3dXT8H5OPjw5kzZ8jOzjbKp9Fo6NChQ6XqtbKywsvLC3t7e25eTUP+fpX2Lez0h7Vl5QewGqGBuXBumJp+A6J///4899xzNGvWzOSkmZeXFy4uLmzYsMHARnzw4EHOnTvHlClTKl2nlZWV/hW8Khk1ahRvvPEGISEhnD9/3sDWDvD000/j5eVFREQEvXv3NvL2WFBQwK5du4zMS+WhE1glte/8/HzWrVtndhk9evRg+/btBm8gaWlpHDhwwODNYODAgWzZsgU7Ozu8vb3NKtvDw4MpU6awbt06Ax/2S5cuNet/oNsNWxmCg4NZtWoV+/btIzAwENDO9cTHxxMSEmKQLyoqik8++UT/RlZQUMDGjRt54okn9G9Vd0Pr1q0ByMnJ4fz58/zpT3+667KqHVO7eusxSujXcZo0acL69evLvT579mzCw8MJCwsjLCyMS5cuMWPGDDp27Mj48ZV/Be3cuTOLFy9m48aNtG/fHnt7+7sSLqWxsbFh3LhxfPDBB/j6+hrZxC0sLNi6dSv9+/fHz8+P1157DX9/fwB++uknli1bhre3d6WEfqdOnfDw8GDGjBk0adIES0tLPvjgg0q1e+bMmWzevJkBAwbwxhtvkJubS3R0NC4uLgbmttDQUFatWkW/fv2YMmUKXbt2JS8vj5SUFOLi4ti2bRu2trYEBAQQHByMr68vdnZ27Nu3j59++snA1HW3/b15s1YDPXr0KAA7duzQT6rqBHxwcDABAQGEhYXx3nvv4ejoSExMDFJKg9VVfn5+jBw5ktdff538/Hw8PT35+OOPOXPmTKUGTVPo3iZycnL0aYV5t8ktKCKlxMreOhObtyFR1gL+unI01s1Z5W2A2rNnj9HmrNjYWPnggw9KjUYjnZycZFhYmExNTTW4z8PDQ4aGhhqVB8ioqCj9eVpamnzyySelnZ2dBGRgYGC5bYuKipLar5KW8jZnHTx4UALyww8/LPP5rl69KiMiImSnTp2kjY2NtLa2lr6+vnL69OkGm7YwsTnLVN0//vijfPTRR6WNjY1s3bq1jIyMNLl5qaz+kVLK3bt3y65du0qNRiM9PT3lkiVL5LBhw6Sfn59BvpycHBkVFSW9vLykRqORjo6O0t/fX0ZFRcn8/HwppZRvvvmm9PPzkw4ODtLW1lZ26dJFLliwoMz+qAyAyUP3P9Rx/fp1OX78eOno6ChtbGzk448/Lo8dO2ZUXnZ2tpw8ebJ0cXGRVlZWsnv37nLPnj1V0tbSHD+RJH/83wn9Rq6fL90w2tBVJ37v9WADF+VszhLyLmbiaxJ/f3+ZmJhY5vVffvmFTp061WCLFPfCjBkzWLBgAampqUbr/+sTWVlZdOjQgcGDB/Pvf/+7tpvTINCZ4nQmNJ2P/pK2/sxLZ/D38zV5f42hM+/oYvXWQYQQR6WU/qauKfOOokb48ccfSU5OZsGCBUyYMKHeCfxJkybRs2dPWrVqRWpqKgsWLCAzM5PXXnuttpvWYLC1teWPP/4gOTkZd3d3mtlYcqPE9dv5hWTn1RHvnfUYJfQVNcLw4cNJT09nwIABZW7iqsvcvn2biIgI0tPT0Wg0dO/enYSEBB588MHablqDxYp8XGzu2P/r7IaueoYS+ooaoSwXv/WF5cuX13YTGgVNmzbVT2InJyej0Wiws7Pj999/5/fLF8jN+YORSw/p8z/l15qQR9xrvqH1eN2+EvoKhaJO4uTkZOBG3MbGGo2VNZAHQFLaLYCaF/r1PBqXEvoKhaJOUnKfhr29PV729hTl/8LGcK3riZIaf41Sz6NxKaGvUCjqBbdu3SI9PR07OzvatGlD2onDpJw5y8gSeWrF3FPPNH8l9BUKRb0gNzfXwB/Rtf2byM/KhSHPA7Vo7qlnO3aV0FcoFPWCFi1a4OrqSps2bQD4evunAHqvqCOXHiIp7ZaR2afWJnvrKMrhmkKhqJe4urry/fff06dPH65du8ZTfq3p7Ga4/yMp7RafHbtUSy2smyhNX6FQNAisLyUysoXWcZ+OWpvsrcMTu0rTr2OsXr1aH5v2119/Nbq+d+9e/fWEhIRqa4MuhKGptp06darc+8+ePYsQgtWrV99V/deuXeOtt96iS5cuNG3aFFtbW3x9fZk2bZpB3F8hBDNnzryrOhoiFy9eZNKkSQQEBGBra4sQosz9EZmZmbz44os4OzvTtGlTgoKCOH7cONrc7du3mTp1Km5ubtjY2BAQEMA333xjlK+oqIiYmBjatm2LtbU1Xbt2ZcuWLVX9iEYMHTqUvXv34uzszMKFC/n+++8B2LhxI3369KEgz/w4EVVGHXfFrIR+HcXe3p7Y2Fij9DVr1hisXa4OyhL6NUFSUhJ+fn6sWbOG0aNHExcXR3x8PGPHjmXLli1MnDixVtpVHzh16hSbNm3C0dFRH1fZFFJKgoOD2blzJ4sWLWLLli3k5+fTt29fLl68aJD3L3/5C8uXL2f27Nl8/vnnuLm5MWDAAI4dO2aQLzIyklmzZvG3v/2NHTt20KNHD0aMGMH27dur41FNEhISwrRp04zSdXZ+3fHfI+ZHibsr/Mdr/fLoDtda9hVUmrI8sZU8gDbAZuAmcAvYCribc2+pct5C6/Vvv7n3NFYvm2PHjpVt27aVRUVF+mvZ2dnSwcFBjhs3zsjLZlUSGBgoH3300TLbVp4HUCnL97JZHvn5+dLb21u2b9/ewJtmyetxcXH6c0x42axKioqKZG5ubrWVX9UUFhbqP5vyIqpj27ZtEpBff/21Pu3GjRvS0dFRTpo0SZ927NgxCciVK1fq0/Lz8+UDDzwghw4dqk9LT0+XGo1Gvv322wb1PP7449LX17cqHk1PZX/vr0R9IB8Z/7Z8bslB+dySg7JL1E753JKDVdqmCqkFr5yU42WzQk1fCGELfA14A2OB0UBHYI8Qoqm5g4sQoh0wAzAOQaQwYvTo0Zw7d479+/fr0z799FMKCwt55plnjPKvXbuWrl27Ym1tjbOzM6NHjzYwhQC0bduWsLAwNmzYQKdOnWjatCn+/v4GdfTp04d9+/Zx4MABvRmpdODta9euERoaioODA61ateLVV18tN9zi/PnzsbKy4urVqwbpUkratWvHqFGjANi6dSsnT55k3rx5JsMTWlhY6KNPlWThwoV4enpib29PYGCgUVSo3bt3M2jQINzc3LC1taVLly68//77RrFpdf2zcuVKvL290Wg0fPGF1pNiQkICf/7zn7G2tqZDhw6sWLGCcePGGQUYz87OJiIiAk9PTzQaDZ6ensyZM4eioiJ9nqysLCZNmoS7uztWVla4uLgQFBTEyZMny+xDcygdSrMs4uLiaNWqFX379tWn3X///QwdOpTPPvvMIJ+lpSUjR95ZCW9hYcHzzz/Prl279CEyd+3aRV5eHmFhYQb1hIWFcfz4cc6cOXMvj3VPJO3dhvXpfWwMD2BjeACd3RxqXvOvY5gzkfsS0A7wklKeAhBC/A/4DQgH/mVmXR8D6wAvM+tt1Hh4eNC7d29iY2P1r+pr1qxh+PDhegdUOpYtW0Z4eDgjR44kJiaG1NRUpk+fzpEjR/jhhx8M8n/77bckJycTHR2NtbU1kZGRDBkyhLNnz9KsWTMWL15MWFgYhYWFLF26FMDII+bo0aMZNWoUW7du5dChQ8yaNQtHR8cyHam98MILREZGsmrVKoMgHbt37+bMmTN6U1JCQgJNmjRh0KBBZvfT2rVr8fLyYsGCBeTl5TF16lSeeuopTp48iYWF9mt2+vRp+vXrx6RJk7C2tiYxMZFZs2Zx9epV5s0zjKe8Z88ejh07RlRUFC1btqRt27YkJSUxePBgunfvzoYNG8jLyyM6OpqbN28aCNqCggIGDBhAUlISkZGR+Pr6cvjwYaKjo8nIyOD9998HYPLkycTFxTF37lw6duzI9evXOXDgADdu3NCXVVhYaHaMXFMhHsvjxIkTdOnSxSjdx8eHNWvWkJWVhZ2dHSdOnMDT09MoXrGPjw95eXmcOnVKH3rRysrKKHyiLtJbUlISnp6elWpjVfHll18CWpPl6tWrmfDuGoPrR85kcORMhsEKn4a+xNMc4RsMHNYJfAAp5RkhxAHgKcwQ+kKIEOAhYBRa01C18u5373Iy4960pnvF28mbiO4R91TGmDFjmDJlCgsXLiQzM5OEhASj+LGFhYVERkbSp08fNmzYcKd+b2969erFypUrefXVV/Xpt27d4tixY/rg166urnTr1o3t27cTEhJC586dcXBwoKCggB49ephsV0hIiF7ABwUFceTIEdavX1+m0HdycmLkyJEsW7aMqVOn6oXU0qVL8fLy0r9JXLhwgRYtWpgdFB20YRA///xzg3CII0aM4LvvvtNH5ioZllFKSa9evcjLy2P+/PnMnTvXQHBnZmZy9OhR/dpv3fM6ODiwa9cufdt69eqFp6enQb7169ezf/9+9u3bR+/evQFtrFuAd955h4iICFq2bMmhQ4cIDQ01CG85fPhwg+fq16+fWfFv9+zZY/QmVhEZGRlGbyhwJ95yZmYmdnZ2ZGRk6L8npvLpgqtnZGTQrFkzo8GndL7aoHSQ+pBH3A0E+n+PnDcQ+LW2wasGMed90Af42UT6CaBzRTcLIRyBD4A3pZS199+vh4wYMYLc3Fzi4+NZt24drq6ueiGiIzk5mStXrhAaGmqQ/thjj+Hh4WEkOAICAgx+yL6+2kmm8+fNf8UtHa7Q19e3wvsnTpxISkoKX331FaCNMRsfH094eLjZ9Zqif//+Bj9sU8+TlpZGeHg4Hh4eaDQaLC0tmTlzJjdu3DAKeN6jRw8DQQ5w+PBhBg0aZDAYubm5GYV73LlzJx4eHvTs2ZOCggL98cQTT5Cfn8/hw4cB6NatG6tXr2bu3LkkJiYamZlAOyCWFWC95PHwww9Xus+klCbfDkq/WVR1vtpk3Lhx7N27l+XLlxvEL75x9HP6ieMG5p9qQbeEs+SRuKp66qoAczR9JyDTRHoGYKwGGPMe8Cuw2txGCSEmABMA3N0rP+Leq4ZdV7C3t2fYsGHExsZy9uxZQkNDjey2Oi2qZIBuHa6urkZalk770qELbl2eTb40psrQ2XfLonv37vj7+7NkyRKCgoJYsWIFFhYWBnFh27Rpw5dffmkQgPxu2gJ3nqeoqIjg4GBSU1OZNWsW3t7e2NjYsG3bNubMmWP03Kb6MS0tzeQcg4uLC6dPn9afX7lyhXPnzhlplzquX78OwKJFi3B1dWXlypXMmDEDJycnxowZw5w5c/TP3aFDB7PNO5XFycnJpPadman9meuUAicnJ5ODuS6fru+dnJzIzMw0Ev6l89UFpJQGQdh180ETJkxgwYIF7F+5GafhM6t2V29p3zxQq/55zLWtm/r2VWhIFEL0AsYAD8lKDPtSymXAMtCGSzT3vobImDFjGDx4MEVFRSYDpOt+UJcvXza6dvnyZX1g8brAK6+8Qnh4OJcuXWLFihWMGDHCQCAEBQWxfPlyduzYYXKy+m5ISUkhMTGR2NhYg4nG+Ph4k/lNaaxubm5GbwQA6enpBufNmzfH09OTTZs2mSxbZ1Kxs7MjJiaGmJgYzp07x+bNm5k2bRoajYZ3330XqF7zjo+PD7t37zZKT0pKwt3dXT8H5OPjw6effmo0CCclJaHRaPQ2fB8fH3Jzc0lJSTGw6yclJQHQuXOFBoEaY8KECUyYMEF/Xnry3NXBmg4mdvXCPZh8SvvmgVr1z2OO0M9Eq+2XxhHTbwAlWQr8G7gohGhWos4mxec5UsryVcRGTv/+/Xnuuedo1qyZfmKsJF5eXri4uLBhwwYDG/HBgwc5d+4cU6ZMqXSdVlZW/P777/fUblOMGjWKN954g5CQEM6fP29gawftTkovLy8iIiLo3bu3gWtd0E6U7tq1y8i8VB66uKslte/8/HzWrVtndhk9evRg+/btBsIvLS2NAwcOGLwZDBw4kC1btmBnZ2dgQigPDw8PpkyZwrp16/j55ztW1KVLl5r1P9AFHKkMwcHBrFq1in379hEYGAho53ri4+MJCQkxyBcVFcUnn3yifyMrKChg48aNPPHEE/q3qoEDB6LRaFi3bh1RUVH6+9euXUuXLl1qbRK3srz22msmw1/W2q7easIcoX8CrV2/NJ2BpAru7VR8vGziWiYwGfg/M9rQaGnSpIlJDb/k9dmzZxMeHk5YWBhhYWFcunSJGTNm0LFjR8aPr/zrY+fOnVm8eDEbN26kffv2Wl/mdyFcSmNjY8O4ceP44IMP8PX1NbKJW1hYsHXrVvr374+fnx+vvfaa/k3lp59+YtmyZXh7e1dK6Hfq1AkPDw9mzJhBkyZNsLS05IMPPqhUu2fOnMnmzZsZMGAAb7zxBrm5uURHR+Pi4mJgbgsNDWXVqlX069ePKVOm0LVrV/Ly8khJSSEuLo5t27Zha2tLQEAAwcHB+Pr6Ymdnx759+/jpp58MTF1329+bN2t3fh49ehSAHTt20KJFC1q0aKEX8MHBwQQEBBAWFsZ7772Ho6MjMTExSCkNVlf5+fkxcuRIXn/9dfLz8/H09OTjjz/mzJkzBoNmy5YtmTx5MjExMdjb2/PQQw+xceNGvv76a4MloPWB+fPns2LFCv0bwLx58zi0JYGAF6NruWVVSFkL+HUH8DpQALQrkdYWyAemVHBvHxPHMeB48ec/VVR/Y92cVd4GqD179hhtzoqNjZUPPvig1Gg00snJSYaFhcnU1FSD+zw8PGRoaKhReYCMiorSn6elpcknn3xS2tnZSUAGBgaW27aoqCip/SppKW9z1sGDByUgP/zwwzKf7+rVqzIiIkJ26tRJ2tjYSGtra+nr6yunT59usGkLE5uzTNX9448/ykcffVTa2NjI1q1by8jISJObl8rqHyml3L17t+zatavUaDTS09NTLlmyRA4bNkz6+fkZ5MvJyZFRUVHSy8tLajQa6ejoKP39/WVUVJTMz8+XUkr55ptvSj8/P+ng4CBtbW1lly5d5IIFC8rsj8qA1hRrdOj+hzquX78ux48fLx0dHaWNjY18/PHH5bFjx4zKy87OlpMnT5YuLi7SyspKdu/eXe7Zs8coX0FBgYyOjpbu7u5So9FIX19f+cknn1TJM5Wkun/vS5culU8//bT+PCYmRrbx71f1G7qqecMW5WzOErICU3vxBqyfgBxgZvGXKBqwBx6UUmYV5/MAUoDZUsrZ5ZS3F7CQUj5WbsXF+Pv7y8TExDKv//LLL3Tq1MmcohR1gBkzZrBgwQJSU1ON1v/XJ7KysujQoQODBw/m3//+d203p9FQG793ncvmkit77nktv86mP/6Le2ydaYQQR6WUJif0KjTvSCn/EEI8jnbZZSzaCdyvgNd1Al9XD9AE5c9HYYIff/yR5ORkFixYwIQJE+qdwJ80aRI9e/akVatWpKamsmDBAjIzM03agBUNi6IfNiPTfofBWlNpfV/Lb9bqHSnleaDc5RRSyrOYsaJHStnHnDoVDYvhw4eTnp7OgAEDytzEVZe5ffs2ERERpKeno9Fo6N69OwkJCTz44IO13TRFNWP1Rzp+DrA2PACo/xO7yh2CokYoy8VvfWH58uW13QRFLbF27VoA3n77bS5cuAA9JlRwR91GmWIUCoWiEaE0fYVCoTCD2bO161M6DRyjTSg299Q3lNBXKBSKSpD3x82qKaiWQioqoa9QKBSVwD9smt4nv45KL+Es7Y+nBn3xKKGvUCgUleApv9YG53e1hLO0P54a9MWjhL5CoVBUgh8+WUgbtC4boP4t4VRCX6FQKCpBTk6O/vPrr7/Oj8fTsOr1wr2Ze2oQtWSzjrF69Wp9bNpff/3V6PrevXv11xMSEqqtDboQhqbadurUKRN33eHs2bMIIVi9evVd1X/t2jXeeustunTpQtOmTbG1tcXX15dp06YZxP0VQjBz5sy7qqMhcvHiRSZNmkRAQAC2trYIIcrcH5GZmcmLL76Is7MzTZs2JSgoiOPHjxvlu337NlOnTsXNzQ0bGxsCAgL45ptvjPIVFRURExND27Ztsba2pmvXrmzZssVk3bpAJlZWVnh5ebFkyZJ7eu6a5qOPPuKjjz7Sn7dvYWfgoiEp7ZZBNK66hhL6dRR7e3tiY2ON0tesWYO9vX211l2W0K8JkpKS8PPzY82aNYwePZq4uDji4+MZO3YsW7ZsYeLEibXSrvrAqVOn2LRpE46Ojvq4yqaQUhIcHMzOnTtZtGgRW7ZsIT8/n759+3Lx4kWDvH/5y19Yvnw5s2fP5vPPP8fNzY0BAwZw7Ngxg3yRkZHMmjWLv/3tb+zYsYMePXowYsQItm/fbpBv+fLlhIeH88wzz7Bz505GjBjBxIkT+fjjj6usH2qS//u//2PHhn/rI29Va/StqqIsT2x15WisXjbHjh0r27ZtK4uKivTXsrOzpYODgxw3bpyRl82qJDAwUD766KNltq08D6BSlu9lszzy8/Olt7e3bN++vYE3zZLX4+Li9OeY8LJZlRQVFcnc3NxqK7+qKSws1H825UVUx7Zt2yQgv/76a33ajRs3pKOjo5w0aZI+7dixYxKQK1eu1Kfl5+fLBx54QA4dOlSflp6eLjUajXz77bcN6nn88celr6+vwb0tWrSQY8aMMcg3fvx42bx5c5mXl1fhM9bF3/vEiROll5eX/rzdY8Hy4dA3K1dIFXvdpBwvm0rTr6OMHj2ac+fOsX//fn3ap59+SmFhocmoUmvXrqVr165YW1vj7OzM6NGjDUwhoI3cFBYWxoYNG+jUqRNNmzbF39/foI4+ffqwb98+Dhw4oDcjlY7MdO3aNUJDQ3FwcKBVq1a8+uqr5YZbnD9/PlZWVly9etUgXUpJu3btGDVqFABbt27l5MmTzJs3z2R4QgsLC4YOHWqUrgt5Z29vT2BgICdOnDC4vnv3bgYNGoSbmxu2trZ06dKF999/3yg2ra5/Vq5cibe3NxqNhi++0HpBTEhI4M9//jPW1tZ06NCBFStWMG7cOKMA49nZ2URERODp6YlGo8HT05M5c+ZQVFSkz5OVlcWkSZNwd3fHysoKFxcXgoKCjKI4VZbSoTTLIi4ujlatWtG3b1992v3338/QoUMN/N/HxcVhaWnJyJEj9WkWFhY8//zz7Nq1Sx8ic9euXeTl5RlEJgMICwvj+PHjnDlzBoBDhw5x9epVo3yjR4/m+vXrBt/D+kTXrl0ZMmSI/vzqb8f441paOXfULmoit47i4eFB7969iY2N1b+qr1mzhuHDh+vD2elYtmwZ4eHhjBw5kpiYGFJTU5k+fTpHjhzhhx9+MMj/7bffkpycTHR0NNbW1kRGRjJkyBDOnj1Ls2bNWLx4MWFhYRQWFrJ06VIAI4+Yo0ePZtSoUWzdupVDhw4xa9YsHB0dy3Sk9sILLxAZGcmqVasMgnTs3r2bM2fO6E1JCQkJNGnShEGDBpndT2vXrsXLy4sFCxaQl5fH1KlTeeqppzh58iQWFtqv9+nTp+nXrx+TJk3C2tqaxMREZs2axdWrV5k3b55BeXv27OHYsWNERUXRsmVL2rZtS1JSEoMHD6Z79+5s2LCBvLw8oqOjuXnzpoGgLSgoYMCAASQlJREZGYmvry+HDx8mOjqajIwM3n//fQAmT55MXFwcc+fOpWPHjly/fp0DBw5w48YNfVmFhYVmx8g1FeKxPE6cOEGXLl2M0n18fFizZg1ZWVnY2dlx4sQJPD09jeIV+/j4kJeXx6lTp/Dx8eHEiRNYWVkZhErU5QOtyc7T01M/GJeuu2S+kgNRfaFk+EWAJ9/ZcO/r+KuRBin0L8+dS+4v96Y13StWnbxxnT79nsoYM2YMU6ZMYeHChWRmZpKQkMCOHTsM8hQWFhIZGUmfPn3YsGGDPt3b25tevXqxcuVKXn31VX36rVu3OHbsmD74taurK926dWP79u2EhITQuXNnHBwcKCgooEePHibbFRISohfwQUFBHDlyhPXr15cp9J2cnBg5ciTLli1j6tSpeiG1dOlSvLy89G8SFy5coEWLFmYHRQdtGMTPP//cIBziiBEj+O677/SRuUqGZZRS0qtXL/Ly8pg/fz5z5841ENyZmZkcPXoUV1dXg+d1cHBg165d+rb16tULT09Pg3zr169n//797Nu3j969ewPaWLcA77zzDhEREbRs2ZJDhw4RGhpqEN5y+PDhBs9VnTFyMzIyjN5Q4E685czMTOzs7MjIyNB/T0zl0wVXz8jIoFmzZkaDj6l8gFGZpfPVd+56HX8N7dBV5p06zIgRI8jNzSU+Pp5169bh6uqqFyI6kpOTuXLlCqGhoQbpjz32GB4eHkaCIyAgwOBH5+vrC8D58+fNblfpcIW+vr4V3j9x4kRSUlL46quvAG2M2fj4eMLDw82u1xT9+/c3EPimnictLY3w8HA8PDzQaDRYWloyc+ZMbty4YRTwvEePHgaCHODw4cMMGjTIYDByc3MzCve4c+dOPDw86NmzJwUFBfrjiSeeID8/n8OHDwPQrVs3Vq9ezdy5c0lMTDQyM4F2QPz+++8rPB5++OFK95mU0uTbQek3i+rIB6aDzzckvlwShe3hZZWb2PV9Flx975xfPg7HN1dL+xqkpn+vGnZdwd7enmHDhhEbG8vZs2cJDQ01stvqtKOSAbp1uLq6GmlPOq1Khy64dXk2+dKYKkNn3y2L7t274+/vz5IlSwgKCmLFihVYWFgYxIVt06YNX375pUEA8rtpC9x5nqKiIoKDg0lNTWXWrFl4e3tjY2PDtm3bmDNnjtFzm+rHtLQ0k3MMLi4unD59Wn9+5coVzp07ZzAIleT69esALFq0CFdXV1auXMmMGTNwcnJizJgxzJkzR//cHTp0MNu8U1mcnJxMatWZmZnAHU3cycnJ5GCuy6freycnJzIzM42Ev6l8oP3OluxnXVtK/y/rK23atNF/DgsL48QtW3wGV6Cx1+AO3QYp9BsSY8aMYfDgwRQVFZkMkK77oVy+fNno2uXLl/WBxesCr7zyCuHh4Vy6dIkVK1YwYsQIgx96UFAQy5cvZ8eOHSYnq++GlJQUEhMTiY2NNZhAjI+PN5nflBbq5uZm9EYAkJ6ebnDevHlzPD092bRpk8mydSYVOzs7YmJiiImJ4dy5c2zevJlp06ah0Wh49913geo17/j4+LB7926j9KSkJNzd3fVzQD4+Pnz66adGg3BSUhIajUZvw/fx8SE3N5eUlBQDu35SUhIAnTt31ucD7ZxCSaFfOl99R+eNs66izDt1nP79+/Pcc8/x8ssv6380JfHy8sLFxcXAng9w8OBBzp07R2BgYKXrtLKyMth1WFWMGjUKe3t7QkJCOH/+vIGtHeDpp5/Gy8uLiIgIo5U+oJ0o1a2mMZfs7GwAA+07Pz+fdevWmV1Gjx492L59u74s0Gr/Bw4cMMg3cOBALly4gJ2dHf7+/kaHs7OzUdkeHh5MmTIFX19ffv75Z316dZp3goODuXTpksGgcuvWLeLj4wkODjbIl5+fzyeffKJPKygoYOPGjTzxxBP6t6qBAwei0WiM+nTt2rV06dIFT09PQGtadHZ2NpnPycmJRx99tNLPUtdZu3ZtxVp+DaM0/TpOkyZNTGr4Ja/Pnj2b8PBwwsLCCAsL49KlS8yYMYOOHTsyfnzlv3CdO3dm8eLFbNy4kfbt22Nvb4+Xl9e9PAYANjY2jBs3jg8++ABfX18jm7iFhQVbt26lf//++Pn58dprr+nfVH766SeWLVuGt7e30ZxCeXTq1AkPDw9mzJhBkyZNsLS05IMPPqhUu2fOnMnmzZsZMGAAb7zxBrm5uURHR+Pi4mJgbgsNDWXVqlX069ePKVOm0LVrV/Ly8khJSSEuLo5t27Zha2tLQEAAwcHB+Pr6Ymdnx759+/jpp58MTF1329+bN2vtwEePHgVgx44dtGjRghYtWugVgODgYAICAggLC+O9997D0dGRmJgYpJQGq6v8/PwYOXIkr7/+Ovn5+Xh6evLxxx9z5swZA8HdsmVLJk+eTExMDPb29jz00ENs3LiRr7/+2mAJqKWlJdHR0UycOJHWrVsTFBTE119/zcqVK1m0aBEajeaunrmuc2hFpPZDePXsoK80ZS3grytHY92cVd4GqD179hhtzoqNjZUPPvig1Gg00snJSYaFhcnU1FSD+zw8PGRoaKhReYCMiorSn6elpcknn3xS2tnZSUAGBgaW27aoqCip/SppKW9z1sGDByUgP/zwwzKf7+rVqzIiIkJ26tRJ2tjYSGtra+nr6yunT59usGkLE5uzTNX9448/ykcffVTa2NjI1q1by8jISJObl8rqHyml3L17t+zatavUaDTS09NTLlmyRA4bNkz6+fkZ5MvJyZFRUVHSy8tLajQa6ejoKP39/WVUVJTMz8+XUkr55ptvSj8/P+ng4CBtbW1lly5d5IIFC8rsj8oAmDx0/0Md169fl+PHj5eOjo7SxsZGPv744/LYsWNG5WVnZ8vJkydLFxcXaWVlJbt37y737NljlK+goEBGR0dLd3d3qdFopK+vr/zkk09MtnHJkiWyY8eOUqPRyA4dOsiPPvrI7Oerj79332EvS5d+4+VzSw4aHOsOnyv7pnvcrEU5m7OENGOyqDbx9/eXiYmJZV7/5Zdf6NSpUw22SHEvzJgxgwULFpCammq0/r8+kZWVRYcOHRg8eDD//ve/a7s5jYb6+Hv/75HzRr54ktJu0dnNgY1lRd/STeSOr5w5U4cQ4qiU0uSEnjLvKGqEH3/8keTkZBYsWMCECRPqncCfNGkSPXv2pFWrVqSmprJgwQIyMzN57bXXartpijpOyCPuRmv0a9MdsxL6ihph+PDhpKenM2DAgDI3cdVlbt++TUREBOnp6Wg0Grp3705CQgIPPvhgbTdNUcd55plnOHHihN7NRnBwMBes2/FAv5EV3Fk9KKGvqBHKcvFbX1i+fHltN0FRTxkwYAABAZUMol5yo1YVo4S+QqFQVCOlffPExcVVbN55cl751+8BJfQVCoWihvlm0d+1H8Jr3ravhL5CoVDUMK18a28jmhL6CoVCUcN06FM1bkbuBuWGQaFQKBoRStNXKBSKGmbv/xXHuAj/vsbrVkJfoVAoapg2D/cj7ebtWomupcw7dYxZs2YhhKCgoKC2m6Jn7969CCHYu3evPq1Pnz6VdumrUCi0/H3SRB4bcmdzVlLaLSNXDdWF0vQVd8XixYtruwkKRb2ltGuGmnTLYJamL4RoI4TYLIS4KYS4JYTYKoSo8D1ECOEvhFgmhDgphMgWQpwXQqwTQnjee9MVtUnnzp0bTNALhaKm6dOnD97e3oA2vsOe9/9KyrfbaqTuCoW+EMIW+BrwBsYCo4GOwB4hRNMKbn8e8AEWAk8C04CHgEQhRJvybmzs/PLLL/Tt2xdbW1vc3Nx4++23KSoqArR+YCZPnkyXLl2ws7PD1dWVoUOH6n176Lh8+TJjx46lVatWWFlZ4ebmxpAhQwyiQGVnZxMREYGnpycajQZPT0/mzJmjr6ssSpt3dCaguLg4/va3v+Hs7EyLFi0ICwvjxo0bBvcWFBQQExODt7c3VlZWtGrViilTplQqZKNCUZ8JCQlh2rRp+vPcP25gobGukbrNMe+8BLQDvKSUpwCEEP8DfgPCgX+Vc++7UkqDEEhCiAPAmeJy376bRjcGhg0bxgsvvMBbb73Frl27iI6O5r777mPWrFnk5uby+++/M3PmTNzc3MjIyGDx4sX06NGDkydP6gN7jx49mnPnzvHee+/Rpk0b0tPT+eqrr/QRoAoKChgwYABJSUlERkbi6+vL4cOHiY6OJiMjg/fff7/S7X7ttdcYMmQI//3vf0lOTubNN9+kSZMm/Oc//9HnCQsLIz4+noiICHr27Mkvv/xCZGQkZ8+eZcuWLVXTgQpFHaakawZLS0sGvm1+JLd7pixH+7oD+Ao4YCJ9H7CvovvLKDMd+Lc5ee82iEpgYKA+kEZeXp4MDAyUsbGxUkop//jjDxkYGCg3bNggpZTyxo0bMjAwUG7ZskVKqQ3iERgYKOPi4qSU2qAigYGBcseOHVJKKc+fPy8DAwP1QUxSUlJkYGCg3Lt3r5RSypMnT5bb5vLQBSSJiYkxSH/xxRelnZ2dzMzMNLqnoKBA/vHHH9LOzk7+61//0qc3bdq03OAca9askYDct2+fQfo//vEPaWlpqQ9YogvaUjJ4RmBgoEFgDl2eMWPGGJT117/+VVpZWcmioiIppZTffPONBOR//vMfg3xr166VgPzxxx/LbK9CUR+DqJjD0wu/lk8v/LrKyqOcICrm2PR9gJ9NpJ8AKm3UFUJ0AloCv1T23sbEc889Z3D+/PPPk5WVpY+jumnTJh555BGaNWuGhYUFTZs2JSsri+TkZP093bp147333mPBggUcP35cN+Dq2blzJx4eHvTs2ZOCggL98cQTT5Cfn8/hw4cr3e7SoQx9fX3Jzc3VBxHfuXMnGo2GZ555xqhOgG+++abSdSoU9Z1vF03h20VTaqQuc8w7TkCmifQMwLEylQkhLIAlwFWgzHBDQogJwAQAd/e7W7dacnmhpaWlwbmtra3B+f33329w7uzsbHDu6upqcN6mTRuD83bt2hmcV0U8WRcXF5Pnly5dIj4+npEjRzJ27FiioqJwdnbmvvvuY9CgQQZ28Y0bN/LOO+/wz3/+k9dffx03NzdefvllZs6cyX333ceVK1c4d+6cQdDwkly/fr3S7XZycjI41wXP1rXrypUr5OXlYWdnV2V1KhT1nfaBw7mUmVMj6/bNXbJpKqaiuIv6PgR6AoOllKYGEm1lUi4DloE2XOJd1FPvSU9Pp127dgbnAK1bt+bjjz+mQ4cOrF69Wn89Pz+fjIwMgzJatmzJRx99xEcffURycjL/+c9/iIqKokWLFrzyyis0b94cT09PNm3aZLINbdu2rfLnat68OdbW1nz77bcmr7dq1arK61Qo6jqTXhxrsE4/Ke0WQK0J/Uy02n5pHDH9BmASIUQMWu19rJRyt7n3NVY2bdpkMLu/YcMG7Ozs6NKlC9nZ2VhYGP7rYmNjKSwsLLM8Ly8v5s6dy5IlS/QmooEDB7Jlyxbs7Oz0y8eqm4EDB/Luu+9y8+ZN+vXrVyN1KhR1ncHe9zPY+37uv/9+oHrX7Zsj9E+gteuXpjOQZE4lQogZaJdrviqljDW/eY2X5cuXU1RURLdu3di1axcrVqxg1qxZNGvWjIEDB7Jt2zYmT57MkCFDOHr0KAsXLqRZs2b6+2/evElQUBChoaF4e3tjaWnJZ599RmZmpt5+HhoayqpVq+jXrx9Tpkyha9eu5OXlkZKSQlxcHNu2bcPW1rZKn6tPnz6MGjWKZ599lr///e90796d++67j7Nnz7J9+3beffddHnjggSqtU6Go6zz11FNkZ2fz3Xffce3aNfa8/1fcu/eHsgKn3wPmCP04YL4Qop2U8jSAEKIt8ChaQV4uQohXgX8AM6SUi+6hrY2Kzz77jEmTJhEdHc3999/PzJkziYyMBOCll17iwoULrFy5kqVLl9KtWzfi4+MZPny4/n5ra2seeughli9fzrlz57jvvvvw8vJi3bp1PPXUU4B2rmPXrl3MmzePZcuWcebMGZo2bUr79u0ZPHgwGo2mWp5t7dq1LFq0iJUrVzJnzhysrKxo27YtAwYMMJrLUCgaAyEhITg7O+vPiwoLsLnfuZw77h5RekWHUQbtBqyfgBxgJlr7fjRgDzwopcwqzucBpACzpZSzi9OeB/4L7AJKR8O+JaWs8E3B399fJiYmlnn9l19+oVOnThUVo1AoGgCN5feuM+9svEtNXwhxVErpb+pahZq+lPIPIcTjwAdALNoJ3K+A13UCX1cP0ATDXb4Di9MHFh8l2Qf0MfMZFAqFotGQc7P6VrGZtXpHSnkeKDfUi5TyLKVW9EgpxwHj7q5pCoVC0Tg5vKLYWcGbQ6q8bOVlU6FQKOoY3gNHV1vZSugrFApFHcPNp0e1la2EvkKhUNQxWlv+UW1lNwihL6VEiLvZIKxQKOoLFa00bEj8sOYf2g8vBFV52fVe6FtaWpKTk1Plm4gUCkXdIicnp0w/UQ2Nkr68qpp6HyO3ZcuWXLp0iezs7EalCSgUjQUpJdnZ2Vy6dImWLVvWdnPqPfVe03dwcAAgNTWV/Pz8Wm6NQqGoDiwtLXFxcdH/3hV3T70X+qAV/OrLoFAoFBVT7807CoVCoTAfJfQVCoWiEaGEvkKhUDQilNBXKBSKRoQS+gqFQtGIUEJfoVAoGhEVBlGpbYQQV4Fzd3m7M3CtCpvT2FH9WfWoPq1aVH9q8ZBStjB1oc4L/XtBCJFYVvQYReVR/Vn1qD6tWlR/Vowy7ygUCkUjQgl9hUKhaEQ0dKG/rLYb0MBQ/Vn1qD6tWlR/VkCDtukrFAqFwpCGrukrFAqFogRK6CsUCkUjosEJfSFEGyHEZiHETSHELSHEViGEe223q64jhHhWCLFFCHFOCJEjhEgWQsQIIexL5XMUQqwQQlwTQvwhhEgQQvjWVrvrG0KInUIIKYT4R6l01a9mIoQYJIT4RgiRVfwbTxRCPF7iuurLcmhQQl8IYQt8DXgDY4HRQEdgjxCiaW22rR7wBlAITAcGAh8DrwBfCiHuAxDaQMRxxdcnAc8Almj790+10ej6hBBiFNDVRLrqVzMRQoQDnwFHgeHACOATwLb4uurLipBSNpgDeA2t4OpQIs0TKAD+Xtvtq8sH0MJE2hhAAo8Xnz9VfN63RJ77gQxgYW0/Q10+gGbAZWBUcR/+o8Q11a/m9WFbIAd4vZw8qi8rOBqUpg8EA4ellKd0CVLKM8ABtF8GRRlIKa+aSP6++G/r4r/BQKqUck+J+24C8aj+rYh/AieklOtNXFP9ah4vAEXAknLyqL6sgIYm9H2An02knwA613BbGgKBxX9/Kf5bXv+6CyHsaqRV9QwhxGNo35omlpFF9at5PAacBJ4XQqQIIQqEEKeEEH8tkUf1ZQU0NKHvBGSaSM8AHGu4LfUaIURrYDaQIKVMLE4ur39B9bERQghLYCkwX0qZXEY21a/m0QrtHN17wDzgCeBL4EMhxGvFeVRfVkCDCIxeClO7zUSNt6IeU6wNfYZ2LmR8yUuo/q0sEYANMKecPKpfzeM+wB4YJ6XcWpz2tRCiLfCWEGIhqi8rpKFp+ploR/rSOGJ69FeUQghhjXb1QztggJTyYonLGZTdv6D62IDipcIzgEjASgjRTAjRrPiy7rwJql/N5Xrx3y9Lpe8GXAA3VF9WSEMT+ifQ2vRK0xlIquG21DuKTRFbgO7AICnl8VJZyuvf81LKrGpuYn2jHWANrEUrbHQHaJfIZgK+qH41lxNlpOu0+CJUX1ZIQxP6cUAPIUQ7XULxq9+jxdcUZVC8Fn8d0A94Skp52ES2OKC1ECKwxH0OwFBU/5riGNDXxAHagaAvcArVr+byafHfAaXSBwAXpZSXUX1ZIQ3K4VrxBqyf0K7lnYnWtheN1g74oBrly0YI8THwMlrb8+elLl+UUl4sHhj2A22AqWg11beAB4GuUsoLNdjkeosQQgJzpJQzi89Vv5pB8carr9BucJsBnAaeBV4CxkspV6u+NIPa3ihQ1QfgjtZEcQv4HdgGtK3tdtX1AziLdpA0dcwqkc8JWInWdppN8Y+wtttfnw5Kbc5S/VqpvnMAPgLSgTzgf0CI6kvzjwal6SsUCoWifBqaTV+hUCgU5aCEvkKhUDQilNBXKBSKRoQS+gqFQtGIUEJfoVAoGhFK6CsUCkUjQgl9hUKhaEQooa9QKBSNiP8HfGuxV6fVNM4AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cph.plot_partial_effects_on_outcome('MonthlyCharges', [10, 100, 1000, 10_000]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- That's the thing with linear models, they can't stop the growth.\n",
    "- We have a negative coefficient associated with `MonthlyCharges`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "coef   -0.003597\n",
       "Name: MonthlyCharges, dtype: float64"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cph_params.loc[\"MonthlyCharges\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If your monthly charges are huge, it takes this to the extreme and thinks you'll basically never churn."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Prediction (10 min)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- We can use survival analysis to make predictions as well.\n",
    "- Here is the expected number of months to churn for the first 5 customers in the test set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>MonthlyCharges</th>\n",
       "      <th>InternetService_DSL</th>\n",
       "      <th>InternetService_Fiber optic</th>\n",
       "      <th>InternetService_No</th>\n",
       "      <th>OnlineSecurity_No</th>\n",
       "      <th>OnlineSecurity_No internet service</th>\n",
       "      <th>OnlineSecurity_Yes</th>\n",
       "      <th>PaymentMethod_Bank transfer (automatic)</th>\n",
       "      <th>PaymentMethod_Credit card (automatic)</th>\n",
       "      <th>PaymentMethod_Electronic check</th>\n",
       "      <th>...</th>\n",
       "      <th>OnlineBackup_No</th>\n",
       "      <th>OnlineBackup_No internet service</th>\n",
       "      <th>OnlineBackup_Yes</th>\n",
       "      <th>PaperlessBilling_Yes</th>\n",
       "      <th>Contract_Month-to-month</th>\n",
       "      <th>Contract_One year</th>\n",
       "      <th>Contract_Two year</th>\n",
       "      <th>TechSupport_No</th>\n",
       "      <th>TechSupport_No internet service</th>\n",
       "      <th>TechSupport_Yes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>941</th>\n",
       "      <td>-1.154900</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1404</th>\n",
       "      <td>-1.383246</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5515</th>\n",
       "      <td>-1.514920</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3684</th>\n",
       "      <td>0.351852</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7017</th>\n",
       "      <td>-1.471584</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 38 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      MonthlyCharges  InternetService_DSL  InternetService_Fiber optic  \\\n",
       "941        -1.154900                  1.0                          0.0   \n",
       "1404       -1.383246                  0.0                          0.0   \n",
       "5515       -1.514920                  0.0                          0.0   \n",
       "3684        0.351852                  0.0                          1.0   \n",
       "7017       -1.471584                  0.0                          0.0   \n",
       "\n",
       "      InternetService_No  OnlineSecurity_No  \\\n",
       "941                  0.0                1.0   \n",
       "1404                 1.0                0.0   \n",
       "5515                 1.0                0.0   \n",
       "3684                 0.0                1.0   \n",
       "7017                 1.0                0.0   \n",
       "\n",
       "      OnlineSecurity_No internet service  OnlineSecurity_Yes  \\\n",
       "941                                  0.0                 0.0   \n",
       "1404                                 1.0                 0.0   \n",
       "5515                                 1.0                 0.0   \n",
       "3684                                 0.0                 0.0   \n",
       "7017                                 1.0                 0.0   \n",
       "\n",
       "      PaymentMethod_Bank transfer (automatic)  \\\n",
       "941                                       0.0   \n",
       "1404                                      1.0   \n",
       "5515                                      0.0   \n",
       "3684                                      0.0   \n",
       "7017                                      1.0   \n",
       "\n",
       "      PaymentMethod_Credit card (automatic)  PaymentMethod_Electronic check  \\\n",
       "941                                     0.0                             1.0   \n",
       "1404                                    0.0                             0.0   \n",
       "5515                                    0.0                             0.0   \n",
       "3684                                    1.0                             0.0   \n",
       "7017                                    0.0                             0.0   \n",
       "\n",
       "      ...  OnlineBackup_No  OnlineBackup_No internet service  \\\n",
       "941   ...              0.0                               0.0   \n",
       "1404  ...              0.0                               1.0   \n",
       "5515  ...              0.0                               1.0   \n",
       "3684  ...              1.0                               0.0   \n",
       "7017  ...              0.0                               1.0   \n",
       "\n",
       "      OnlineBackup_Yes  PaperlessBilling_Yes  Contract_Month-to-month  \\\n",
       "941                1.0                   0.0                      1.0   \n",
       "1404               0.0                   0.0                      0.0   \n",
       "5515               0.0                   0.0                      0.0   \n",
       "3684               0.0                   1.0                      1.0   \n",
       "7017               0.0                   0.0                      0.0   \n",
       "\n",
       "      Contract_One year  Contract_Two year  TechSupport_No  \\\n",
       "941                 0.0                0.0             1.0   \n",
       "1404                0.0                1.0             0.0   \n",
       "5515                0.0                1.0             0.0   \n",
       "3684                0.0                0.0             1.0   \n",
       "7017                0.0                1.0             0.0   \n",
       "\n",
       "      TechSupport_No internet service  TechSupport_Yes  \n",
       "941                               0.0              0.0  \n",
       "1404                              1.0              0.0  \n",
       "5515                              1.0              0.0  \n",
       "3684                              0.0              0.0  \n",
       "7017                              1.0              0.0  \n",
       "\n",
       "[5 rows x 38 columns]"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_test_surv.drop(columns=['tenure', 'Churn']).head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tenure</th>\n",
       "      <th>Churn</th>\n",
       "      <th>MonthlyCharges</th>\n",
       "      <th>InternetService_DSL</th>\n",
       "      <th>InternetService_Fiber optic</th>\n",
       "      <th>InternetService_No</th>\n",
       "      <th>OnlineSecurity_No</th>\n",
       "      <th>OnlineSecurity_No internet service</th>\n",
       "      <th>OnlineSecurity_Yes</th>\n",
       "      <th>PaymentMethod_Bank transfer (automatic)</th>\n",
       "      <th>...</th>\n",
       "      <th>OnlineBackup_No</th>\n",
       "      <th>OnlineBackup_No internet service</th>\n",
       "      <th>OnlineBackup_Yes</th>\n",
       "      <th>PaperlessBilling_Yes</th>\n",
       "      <th>Contract_Month-to-month</th>\n",
       "      <th>Contract_One year</th>\n",
       "      <th>Contract_Two year</th>\n",
       "      <th>TechSupport_No</th>\n",
       "      <th>TechSupport_No internet service</th>\n",
       "      <th>TechSupport_Yes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>941</th>\n",
       "      <td>13.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.154900</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1404</th>\n",
       "      <td>35.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.383246</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5515</th>\n",
       "      <td>18.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.514920</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3684</th>\n",
       "      <td>43.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.351852</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7017</th>\n",
       "      <td>51.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.471584</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 40 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      tenure  Churn  MonthlyCharges  InternetService_DSL  \\\n",
       "941     13.0    0.0       -1.154900                  1.0   \n",
       "1404    35.0    0.0       -1.383246                  0.0   \n",
       "5515    18.0    0.0       -1.514920                  0.0   \n",
       "3684    43.0    0.0        0.351852                  0.0   \n",
       "7017    51.0    0.0       -1.471584                  0.0   \n",
       "\n",
       "      InternetService_Fiber optic  InternetService_No  OnlineSecurity_No  \\\n",
       "941                           0.0                 0.0                1.0   \n",
       "1404                          0.0                 1.0                0.0   \n",
       "5515                          0.0                 1.0                0.0   \n",
       "3684                          1.0                 0.0                1.0   \n",
       "7017                          0.0                 1.0                0.0   \n",
       "\n",
       "      OnlineSecurity_No internet service  OnlineSecurity_Yes  \\\n",
       "941                                  0.0                 0.0   \n",
       "1404                                 1.0                 0.0   \n",
       "5515                                 1.0                 0.0   \n",
       "3684                                 0.0                 0.0   \n",
       "7017                                 1.0                 0.0   \n",
       "\n",
       "      PaymentMethod_Bank transfer (automatic)  ...  OnlineBackup_No  \\\n",
       "941                                       0.0  ...              0.0   \n",
       "1404                                      1.0  ...              0.0   \n",
       "5515                                      0.0  ...              0.0   \n",
       "3684                                      0.0  ...              1.0   \n",
       "7017                                      1.0  ...              0.0   \n",
       "\n",
       "      OnlineBackup_No internet service  OnlineBackup_Yes  \\\n",
       "941                                0.0               1.0   \n",
       "1404                               1.0               0.0   \n",
       "5515                               1.0               0.0   \n",
       "3684                               0.0               0.0   \n",
       "7017                               1.0               0.0   \n",
       "\n",
       "      PaperlessBilling_Yes  Contract_Month-to-month  Contract_One year  \\\n",
       "941                    0.0                      1.0                0.0   \n",
       "1404                   0.0                      0.0                0.0   \n",
       "5515                   0.0                      0.0                0.0   \n",
       "3684                   1.0                      1.0                0.0   \n",
       "7017                   0.0                      0.0                0.0   \n",
       "\n",
       "      Contract_Two year  TechSupport_No  TechSupport_No internet service  \\\n",
       "941                 0.0             1.0                              0.0   \n",
       "1404                1.0             0.0                              1.0   \n",
       "5515                1.0             0.0                              1.0   \n",
       "3684                0.0             1.0                              0.0   \n",
       "7017                1.0             0.0                              1.0   \n",
       "\n",
       "      TechSupport_Yes  \n",
       "941               0.0  \n",
       "1404              0.0  \n",
       "5515              0.0  \n",
       "3684              0.0  \n",
       "7017              0.0  \n",
       "\n",
       "[5 rows x 40 columns]"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_test_surv.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "941     35.399514\n",
       "1404    69.120668\n",
       "5515    68.453006\n",
       "3684    28.166816\n",
       "7017    68.022376\n",
       "dtype: float64"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cph.predict_expectation(df_test_surv).head() # assumes they just joined right now"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "941     35.034987\n",
       "1404    66.845293\n",
       "5515    67.185179\n",
       "3684    16.569810\n",
       "7017    64.261491\n",
       "dtype: float64"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cph.predict_expectation(df_test_surv, conditional_after=df_test_surv[\"tenure\"]).head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Survival curves for first 5 customers in the test set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cph.predict_survival_function(df_test_surv[:5]).plot();\n",
    "plt.xlabel('Time with service (months)');\n",
    "plt.ylabel('Survival probability');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From `predict_survival_function` documentation:\n",
    "\n",
    "> Predict the survival function for individuals, given their covariates. This assumes that the individual just entered the study (that is, we do not condition on how long they have already lived for.) \n",
    "\n",
    "So these curves are \"starting now\"."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- There's no probability prerequisite for this course, so this is optional material.\n",
    "- But you can do some interesting stuff here with conditional probabilities.\n",
    "- \"Given that a customer has been here 5 months, what's the outlook?\"\n",
    "  - It will be different than for a new customer. \n",
    "  - Thus, we might still want to predict for the non-churned customers in the training set!\n",
    "  - Not something we really thought about with our traditional supervised learning."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train_surv_not_churned = df_train_surv[df_train_surv[\"Churn\"] == 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6464    50.0\n",
       "Name: tenure, dtype: float64"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train_surv_not_churned[:1][\"tenure\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cph.predict_survival_function(df_train_surv_not_churned[:1]).plot();\n",
    "plt.xlabel('Time with service (months)');\n",
    "plt.ylabel('Survival probability');\n",
    "plt.ylim([0,1]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can _condition_ on the person having been around for 50 months."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>6464</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0.0</th>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1.0</th>\n",
       "      <td>0.996929</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2.0</th>\n",
       "      <td>0.992320</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3.0</th>\n",
       "      <td>0.989908</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4.0</th>\n",
       "      <td>0.983341</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>68.0</th>\n",
       "      <td>0.450575</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69.0</th>\n",
       "      <td>0.450575</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>70.0</th>\n",
       "      <td>0.450575</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>71.0</th>\n",
       "      <td>0.450575</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>72.0</th>\n",
       "      <td>0.450575</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>73 rows × 1 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          6464\n",
       "0.0   1.000000\n",
       "1.0   0.996929\n",
       "2.0   0.992320\n",
       "3.0   0.989908\n",
       "4.0   0.983341\n",
       "...        ...\n",
       "68.0  0.450575\n",
       "69.0  0.450575\n",
       "70.0  0.450575\n",
       "71.0  0.450575\n",
       "72.0  0.450575\n",
       "\n",
       "[73 rows x 1 columns]"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cph.predict_survival_function(df_train_surv_not_churned[:1], conditional_after=20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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iI2N9Z+Dl19+mdGjR5OQkEBqaipnnHFGWJPNjR8/nqOOOop33nmHkSNHEh8fz8EHH8xnn31GVVUVf/rTn+jevTvp6elMmzaN0tLSWttv2rSJ888/n8zMTGJjYznwwAOZOXNmrTy+5puFCxdyzjnnkJycTI8ePfjNb37jnwZ73rx5/hlFjz32WEQEEWHevHm19vXss89ywAEHkJiYSF5eHh9//HGt9YsWLeLYY48lIyODhIQE+vXrx6WXXtroefj++++ZMmUKqampxMfHM3r0aN555x3/+mnTpjF+/HgAjj76aESkwdruu+++y5gxY0hJSaFLly4MHjyYm2++uVaer776ilNOOYW0tDTi4+M58sgj+eijj2rlmTZtGr169WLBggX+Zt1rrrmGE088kUMOOaTOcTdt2kRUVBR/+9vfgPqbzh555BFGjRpFfHw8aWlpjBs3jk8//dS/Ppz/zRa3r5GqPS2dqUZTWVmpcXFxevbZZ4e9jW+uFl8tZ8OGDRoREaH3339/rXyLFy9WQF988UX/sY466ihNT0/Xe+65R2fPnq233nqrxsbG6m9/+1v/dr5fubm5uXr55Zfru+++q/fdd5/GxcXp+eefv1fvc/To0Tps2DD/66VLlyqgTz/9dJ28BxxwgJ5++ukN7u+mm25SQIcPH6733nuvvvfeezp58mQF9I9//KMeccQR+sorr+jzzz+v3bt318MOO6zW9meddZZGRkbqDTfcoO+++65Onz5do6Ki9KyzzvLn8Z3nHj166KmnnqpvvPGGvvrqq1pWVqYPPPCAAnrhhRfqW2+9pc8++6wOGTJEc3NztaioqMGyjxs3Trt27arDhw/XZ555Rt944w094IADNDs7Wy+66CKdNm2avvPOO3rPPfdoVFSU/v73v/dvW1JSogMHDtTMzEx96KGH9O2339azzz5bAX3ooYf8+R5//HEFdMCAAXrDDTfo+++/rzfffLNGRETojTfeqKqqO3fu1Pvvv18Bve+++3TBggW6YMEC3blzp6q6Gk1OTo7m5eXpCy+8oG+88YaOHDlSU1JSdPv27aqqWlxcrGlpaTpp0iR9/fXXde7cufr444/rxRdf3OA52LBhg2ZmZmrfvn31qaee0tdff10nTZqkERER+vbbb6uq6sqVK/W+++5TQO+//35dsGCBrly5MuT+Vq1apTExMXr22Wfr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5cqVIc9jfV8mzWHcuHGsX7+eTz6pPZTh008/TXZ2NgcccECT9ueroTTHTbJRUVGMHj2aW265hZqaGpYuXVpv3nHjxrFw4cJaPbOqq6t57rnnOPjgg/cpWMfGxjJx4kSuueYaSktLWbNmjX9216+++opRo0aF/NzCISKcc845vPjii7z99tusX7++wWYzcDXfiIgIHn744XrztNb/ZmOsRtOBHX300fz5z3/m2muv5euvv+b888+nb9++7Nq1i+XLl/Pss8+SmJhY768sn2OOOYYePXrwi1/8grKysjrXIM455xwef/xxjj76aK6++moOOuggdu/ezapVq3j99dd59dVXQ3ZNbor8/HyOPfZYdu/ezYwZM+pcMzj44IP9X27Tp0/niCOOYOrUqVx22WWsXbuW3//+95x++ukhu5E2l2HDhnHWWWcxffp0qqqqGDNmDAsWLOCWW27hrLPO4sADD2xw++TkZP76179y2WWXUVBQwAknnEBKSgobNmxg/vz5jB8/nrPPPrtFyj5t2jTuvfde/t//+3/cdttt9OrVi1mzZvH+++/z0EMPhWzuacigQYOIioriscceIz09ndjYWAYPHhz2F/2bb77Jww8/zOTJk+nbty+lpaXcd999JCUlccQRR9S73VVXXcUTTzzBsccey4wZM0hOTuYf//gHy5cv56233mrSewB48MEH+fDDDznxxBPp3bs3W7du5fbbb6dHjx7+WtXdd9/N2LFjmTRpEr/4xS/o3r07W7du5csvv6S6upo//zm85vfzzz+f22+/nV/96lf07t3b/8OlPv379+eqq67i7rvvpri4mFNOOYXIyEg+//xzhgwZws9+9rNW+d8My772JmhPS2fq3hzo448/1jPOOEN79Oih0dHRmpSUpHl5eXrjjTfqxo0b/flC9Trz+d3vfqeAHnHEESGPUV5erjfddJMOHjxYY2JiNC0tTfPy8vSmm27y92yrrydSqG6bwXzb1rcEbzt//nwdPXq0xsbGanZ2tl5xxRUhb/gM5ut1FtgbTzX0TYah3s/u3bv1uuuu05ycHI2KitKcnBy97rrrat086jvPjzzySMgyvPXWWzp+/HhNSkrSuLg47d+/v1544YV1ur8GGzdunB555JG10uo7Vqj3uXHjRj333HM1IyNDY2JidMSIEfrUU0/V2s73WQX26grcX6AHH3xQ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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "cph.predict_survival_function(df_train_surv_not_churned[:1]).plot(ax=plt.gca());\n",
    "preds = cph.predict_survival_function(df_train_surv_not_churned[:1], conditional_after=20)\n",
    "plt.plot(preds.index[20:], preds.values[:-20])\n",
    "plt.xlabel('Time with service (months)');\n",
    "plt.ylabel('Survival probability');\n",
    "plt.legend([\"Starting now\", \"Given 20 more months of service\"])\n",
    "plt.ylim([0,1]);\n",
    "plt.xlim([1,50]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Look at how the survival function (and expected lifetime) is much longer _given_ that the customer has already lasted 20 months."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So, we can set this to their actual tenure so far to get a prediciton of what will happen going forward:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cph.predict_survival_function(df_train_surv_not_churned[:1], conditional_after=df_train_surv_not_churned[:1][\"tenure\"]).plot();\n",
    "plt.xlabel('Time into the future (months)');\n",
    "plt.ylabel('Survival probability');\n",
    "plt.ylim([0,1]);\n",
    "plt.xlim([0,20]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Another useful application: you could ask what is the [customer lifetime value](https://en.wikipedia.org/wiki/Customer_lifetime_value).\n",
    "  - Basically, how much money do you expect to make off this customer between now and when they churn?\n",
    "- With regular supervised learning, tenure was a feature and we could only predict whether or not they had churned by then."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TODO\n",
    "\n",
    "- clarify the above section, talk more about why it matters that they've been here for X months"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Other approaches / what did we not cover? (5 min)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Measures of model accuracy\n",
    "\n",
    "By default score returns \"partial log likelihood\":"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.8646212793677286"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cph.score(df_train_surv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.727691684168186"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cph.score(df_test_surv)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can look at the \"concordance index\":"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "cph.concordance_index_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8626990298786501"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cph.score(df_train_surv, scoring_method=\"concordance_index\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8545229998086725"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cph.score(df_test_surv, scoring_method=\"concordance_index\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From the documentation [here](https://lifelines.readthedocs.io/en/latest/Survival%20Regression.html#model-selection-and-calibration-in-survival-regression):\n",
    "\n",
    "> Another censoring-sensitive measure is the concordance-index, also known as the c-index. This measure evaluates the accuracy of the ranking of predicted time. It is in fact a generalization of AUC, another common loss function, and is interpreted similarly:\n",
    "> \n",
    "> - 0.5 is the expected result from random predictions,\n",
    "> - 1.0 is perfect concordance and,\n",
    "> - 0.0 is perfect anti-concordance (multiply predictions with -1 to get 1.0)\n",
    "> \n",
    "> [Here](https://stats.stackexchange.com/a/478305/11867) is an excellent introduction & description of the c-index for new users.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# cph.log_likelihood_ratio_test()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# cph.check_assumptions(df_train_surv)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Other approaches\n",
    "\n",
    "There are many other approaches to modelling in survival analysis:\n",
    "\n",
    "- Time-varying proportional hazards.\n",
    "  - What if some of the features change over time, e.g. plan type, number of lines, etc.\n",
    "- Approaches based on deep learning, e.g. the [pysurvival](https://square.github.io/pysurvival/) package.\n",
    "- Random survival forests.\n",
    "- And more..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Types of censoring\n",
    "There are also various types and sub-types of censoring we didn't cover:\n",
    "\n",
    "- What we did today is called \"right censoring\"\n",
    "- Sub-types within right censoring\n",
    "  - Did everyone join at the same time?\n",
    "  - Other there other reasons the data might be censored at random times, e.g. the person died?\n",
    "- Left censoring\n",
    "- Interval censoring"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary\n",
    "\n",
    "- Censoring and incorrect approaches to handling it\n",
    "  - Throw away people who haven't churned\n",
    "  - Assume everyone churns today\n",
    "- Predicting tenure vs. churned\n",
    "- Survival analysis encompasses both of these, and deals with censoring\n",
    "- And it can make rich and interesting predictions!\n",
    "- KM model -> doesn't look at features\n",
    "- CPH model -> like linear regression, does look at the features"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Time-permitting\n",
    "\n",
    "\n",
    "- Outliers T/F: https://piazza.com/class/kb2e6nwu3uj23?cid=466\n",
    "- Time series T/F: https://piazza.com/class/kb2e6nwu3uj23?cid=512\n",
    "- Survival analysis T/F: https://piazza.com/class/kb2e6nwu3uj23?cid=513"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## True/False questions\n",
    "\n",
    "1. If all customers joined a service at the same time (hypothetically), then censoring would not be an issue.\n",
    "3. The Cox proportional hazards model (`cph` above) assumes the effect of a feature is the same for all customers and over all time.\n",
    "4. Survival analysis can be useful even without a \"deployment\" stage.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## References\n",
    "\n",
    "Some people working with this same dataset:\n",
    "\n",
    "- https://medium.com/@zachary.james.angell/applying-survival-analysis-to-customer-churn-40b5a809b05a\n",
    "- https://towardsdatascience.com/churn-prediction-and-prevention-in-python-2d454e5fd9a5 (Cox)\n",
    "- https://towardsdatascience.com/survival-analysis-in-python-a-model-for-customer-churn-e737c5242822\n",
    "- https://towardsdatascience.com/survival-analysis-intuition-implementation-in-python-504fde4fcf8e\n",
    "\n",
    "lifelines documentation: \n",
    "- https://lifelines.readthedocs.io/en/latest/Survival%20analysis%20with%20lifelines.html\n",
    "- https://lifelines.readthedocs.io/en/latest/Survival%20Analysis%20intro.html#introduction-to-survival-analysis"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
